?以下是一個包含基礎注釋的 C# 程序示例,展示了 C# 中各類注釋的使用方法:
using System;namespace BasicCSharpProgram
{/// <summary>/// Program 類是應用程序的入口點/// 包含 Main 方法作為程序執行的起點/// </summary>public class Program{// 程序入口點,程序從這里開始執行// args 參數接收命令行傳入的參數public static void Main(string[] args){// 聲明并初始化一個整數變量int number = 10;// 聲明一個字符串變量,用于存儲用戶姓名string? name; // C# 8.0 及以后版本的可空引用類型// 調用方法獲取用戶輸入name = GetUserName();// 調用打印歡迎信息的方法PrintWelcomeMessage(name, number);// 調用計算并顯示結果的方法CalculateAndDisplay(5, 3);// 打印當前日期(使用日期時間格式化)Console.WriteLine($"今天是: {DateTime.Now:yyyy-MM-dd}");// 演示數組的使用int[] numbers = new int[5];FillArray(numbers);DisplayArray(numbers);}/// <summary>/// 獲取用戶輸入的姓名/// </summary>/// <returns>用戶輸入的姓名</returns>static string GetUserName(){Console.Write("請輸入您的姓名: ");return Console.ReadLine() ?? ""; // 空合并運算符處理可能的 null}/// <summary>/// 打印歡迎信息/// </summary>/// <param name="userName">用戶姓名</param>/// <param name="count">計數</param>static void PrintWelcomeMessage(string userName, int count){// 使用字符串插值Console.WriteLine($"歡迎, {userName}! 這是您的第 {count} 次訪問。");}/// <summary>/// 執行基本數學運算并顯示結果/// </summary>/// <param name="a">第一個操作數</param>/// <param name="b">第二個操作數</param>static void CalculateAndDisplay(int a, int b){// 加法運算int sum = a + b;Console.WriteLine($"{a} + {b} = {sum}");// 減法運算int difference = a - b;Console.WriteLine($"{a} - {b} = {difference}");// 乘法運算int product = a * b;Console.WriteLine($"{a} × {b} = {product}");// 除法運算(整數除法)if (b != 0) // 檢查除數是否為零{int quotient = a / b;Console.WriteLine($"{a} ÷ {b} = {quotient}");}else{Console.WriteLine("錯誤:除數不能為零");}}/// <summary>/// 使用示例值填充數組/// </summary>/// <param name="array">要填充的整數數組</param>static void FillArray(int[] array){// 檢查數組是否為 nullif (array == null){throw new ArgumentNullException(nameof(array), "數組不能為 null");}// 使用循環填充數組for (int i = 0; i < array.Length; i++){array[i] = i * 2; // 填充 0, 2, 4, 6, 8}}/// <summary>/// 顯示數組內容/// </summary>/// <param name="array">要顯示的整數數組</param>static void DisplayArray(int[] array){Console.Write("數組內容: ");foreach (int num in array){Console.Write(num + " ");}Console.WriteLine(); // 換行}}
}
這個程序展示了如何使用 C# 的?Roslyn 編譯器 API(通過?Microsoft.CodeAnalysis.CSharp.Scripting
?命名空間)在運行時動態編譯和執行 C# 代碼。這種技術常用于腳本引擎、動態配置或需要靈活擴展的應用程序。
程序結構與核心組件
命名空間引用:
using System; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp.Scripting;
System.Threading.Tasks
:提供異步編程支持(async/await
)。Microsoft.CodeAnalysis.CSharp.Scripting
:Roslyn 的腳本 API,用于動態編譯和執行 C# 代碼。
異步 Main 方法:
static async Task Main()
async Task
:允許使用?await
?關鍵字等待異步操作完成。
動態代碼執行示例
示例 1:簡單代碼片段
string code = @"Console.WriteLine(""這是一段動態執行的 C# 代碼"");return 42;";var result = await CSharpScript.EvaluateAsync<int>(code);
Console.WriteLine($"代碼執行結果: {result}");
- 關鍵點:
CSharpScript.EvaluateAsync<int>(code)
:- 編譯并執行?
code
?字符串中的代碼。 <int>
?指定返回值類型(必須與代碼中的?return
?類型匹配)。
- 編譯并執行?
- 隱式引用:
- 默認包含?
System
?命名空間,無需顯式?using System;
。
- 默認包含?
- 異步執行:
await
?確保等待代碼執行完成后再繼續。
示例 2:復雜代碼(帶類型和命名空間)
string complexCode = @"using System;using System.Collections.Generic;public class Calculator{public int Add(int a, int b) => a + b;}var calc = new Calculator();return calc.Add(5, 7);";var complexResult = await CSharpScript.EvaluateAsync<int>(complexCode);
Console.WriteLine($"復雜代碼執行結果: {complexResult}");
- 關鍵點:
- 顯式命名空間:
- 需要在代碼中手動添加?
using
?語句(如?using System.Collections.Generic;
)。
- 需要在代碼中手動添加?
- 類型定義:
- 可以在腳本中定義類(如?
Calculator
)和方法(如?Add
)。
- 可以在腳本中定義類(如?
- 執行流程:
- 創建?
Calculator
?實例 → 調用?Add
?方法 → 返回結果?12
。
- 創建?
- 顯式命名空間:
異常處理
catch (Exception ex)
{Console.WriteLine($"執行代碼時出錯: {ex.Message}");
}
- 可能的異常:
- 編譯錯誤:代碼語法錯誤或缺少引用。
- 運行時錯誤:腳本中的異常(如除零錯誤)。
Roslyn API 特點
- 輕量級執行:
- 無需生成完整的程序集,直接執行代碼片段。
- 沙箱限制:
- 默認情況下,腳本無法訪問外部變量或類型,除非通過?
WithImports
?或?WithReferences
?顯式允許。
- 默認情況下,腳本無法訪問外部變量或類型,除非通過?
- 高級用法:
- 可通過?
ScriptOptions
?配置引用的程序集和命名空間:var options = ScriptOptions.Default.WithReferences(typeof(MyClass).Assembly) // 引用外部程序集.WithImports("MyNamespace"); // 導入命名空間await CSharpScript.EvaluateAsync(code, options);
- 可通過?
應用場景
- 動態配置:允許用戶通過腳本自定義應用行為。
- 插件系統:支持加載和執行第三方代碼。
- 教育工具:實現在線代碼編輯器或學習平臺。
- 測試框架:動態生成和執行測試用例。
注意事項
- 安全風險:
- 避免執行不受信任的代碼(可能導致系統漏洞)。
- 性能開銷:
- 編譯過程比直接執行慢,不適合高頻調用的場景。
- 版本兼容性:
- 需要安裝?
Microsoft.CodeAnalysis.CSharp.Scripting
?NuGet 包(通常隨 .NET SDK 自動安裝)。
- 需要安裝?