C#注释技巧与基础编程示例

 以下是一个包含基础注释的 C# 程序示例,展示了 C# 中各类注释的使用方法:

using System;

namespace BasicCSharpProgram
{
    /// 
    /// Program 类是应用程序的入口点
    /// 包含 Main 方法作为程序执行的起点
    /// 
    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);
        }

        /// 
        /// 获取用户输入的姓名
        /// 
        /// 用户输入的姓名
        static string GetUserName()
        {
            Console.Write("请输入您的姓名: ");
            return Console.ReadLine() ?? "";  // 空合并运算符处理可能的 null
        }

        /// 
        /// 打印欢迎信息
        /// 
        /// 用户姓名
        /// 计数
        static void PrintWelcomeMessage(string userName, int count)
        {
            // 使用字符串插值
            Console.WriteLine($"欢迎, {userName}! 这是您的第 {count} 次访问。");
        }

        /// 
        /// 执行基本数学运算并显示结果
        /// 
        /// 第一个操作数
        /// 第二个操作数
        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("错误:除数不能为零");
            }
        }

        /// 
        /// 使用示例值填充数组
        /// 
        /// 要填充的整数数组
        static void FillArray(int[] array)
        {
            // 检查数组是否为 null
            if (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
            }
        }

        /// 
        /// 显示数组内容
        /// 
        /// 要显示的整数数组
        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# 代码。这种技术常用于脚本引擎、动态配置或需要灵活扩展的应用程序。

程序结构与核心组件

  1. 命名空间引用
    using System;
    using System.Threading.Tasks;
    using Microsoft.CodeAnalysis.CSharp.Scripting;
    
     
    • System.Threading.Tasks:提供异步编程支持(async/await)。
    • Microsoft.CodeAnalysis.CSharp.Scripting:Roslyn 的脚本 API,用于动态编译和执行 C# 代码。
  2. 异步 Main 方法
    static async Task Main()
    
     
    • async Task:允许使用 await 关键字等待异步操作完成。

动态代码执行示例

示例 1:简单代码片段
string code = @"
    Console.WriteLine(""这是一段动态执行的 C# 代码"");
    return 42;";

var result = await CSharpScript.EvaluateAsync(code);
Console.WriteLine($"代码执行结果: {result}");
  • 关键点
    1. CSharpScript.EvaluateAsync(code)
      • 编译并执行 code 字符串中的代码。
      •  指定返回值类型(必须与代码中的 return 类型匹配)。
    2. 隐式引用
      • 默认包含 System 命名空间,无需显式 using System;
    3. 异步执行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(complexCode);
Console.WriteLine($"复杂代码执行结果: {complexResult}");
  • 关键点
    1. 显式命名空间
      • 需要在代码中手动添加 using 语句(如 using System.Collections.Generic;)。
    2. 类型定义
      • 可以在脚本中定义类(如 Calculator)和方法(如 Add)。
    3. 执行流程
      • 创建 Calculator 实例 → 调用 Add 方法 → 返回结果 12

异常处理

catch (Exception ex)
{
    Console.WriteLine($"执行代码时出错: {ex.Message}");
}
  • 可能的异常
    • 编译错误:代码语法错误或缺少引用。
    • 运行时错误:脚本中的异常(如除零错误)。

Roslyn API 特点

  1. 轻量级执行
    • 无需生成完整的程序集,直接执行代码片段。
  2. 沙箱限制
    • 默认情况下,脚本无法访问外部变量或类型,除非通过 WithImports 或 WithReferences 显式允许。
  3. 高级用法
    • 可通过 ScriptOptions 配置引用的程序集和命名空间:
      var options = ScriptOptions.Default
          .WithReferences(typeof(MyClass).Assembly)  // 引用外部程序集
          .WithImports("MyNamespace");               // 导入命名空间
      
      await CSharpScript.EvaluateAsync(code, options);
      

应用场景

  1. 动态配置:允许用户通过脚本自定义应用行为。
  2. 插件系统:支持加载和执行第三方代码。
  3. 教育工具:实现在线代码编辑器或学习平台。
  4. 测试框架:动态生成和执行测试用例。

注意事项

  1. 安全风险
    • 避免执行不受信任的代码(可能导致系统漏洞)。
  2. 性能开销
    • 编译过程比直接执行慢,不适合高频调用的场景。
  3. 版本兼容性
    • 需要安装 Microsoft.CodeAnalysis.CSharp.Scripting NuGet 包(通常随 .NET SDK 自动安装)。

你可能感兴趣的:(C#,c#,算法,开发语言)