以下是一个包含基础注释的 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 自动安装)。
- 需要安装