淡若轻风

博客园 首页 新随笔 联系 订阅 管理

C# 11 在 .NET 7 的发布中正式亮相,进一步增强了语言的表达力和安全性,同时引入了多个新特性来简化代码编写和提高运行效率。

以下是 C# 11 的主要功能及其简介:

 

1️⃣ 原始字符串字面量(Raw String Literals)

    • 作用:
      允许使用三个双引号 """ 来定义多行字符串,无需对内部的特殊字符(如反斜杠、引号等)进行额外转义。

    • 优势:
      极大简化了书写包含复杂格式(如 JSON、XML、正则表达式等)的字符串,提高了代码可读性,同时支持字符串插值(通过在开头加 $""")。

    • 示例:

      var json = """
          {
              "name": "Alice",
              "message": "这是一个 \"原始字符串\" 示例。"
          }
          """;
      
      // 带插值的原始字符串字面量
      var user = "Bob";
      var greeting = $"""
          Hello, {user}!
          欢迎体验 C# 11 的原始字符串字面量。
          """;
      Console.WriteLine(greeting);

       

 

2️⃣ required 成员

    • 作用:
      通过在类的属性或字段前添加 required 修饰符,强制在对象初始化时必须为这些成员赋值,确保对象在使用前处于有效状态。

    • 优势:
      能有效防止因未初始化而导致的运行时错误,提升类型安全性和代码的健壮性。

    • 示例:

      public class Person
      {
          // 使用 required 强制要求初始化 Name 属性
          public required string Name { get; init; }
          public int Age { get; set; }
      }
      
      // 正确:在对象初始化时提供了 Name 的值
      var person = new Person { Name = "Alice", Age = 30 };
      
      // 错误示例:如果缺少 Name 的赋值,编译器会报错
      // var personError = new Person { Age = 25 };

       

 

3️⃣ 列表模式(List Patterns)

    • 作用:
      扩展了模式匹配功能,可以直接对数组、列表等序列进行结构匹配。

    • 优势:
      使得对集合中元素的检查更加直观,可以利用 [element1, element2, ..] 的写法匹配序列的前几个元素或捕获剩余元素。

    • 示例:

int[] numbers = { 1, 2, 3, 4, 5 };

// 检查数组是否以 1, 2 开头,不关心后续元素
if (numbers is [1, 2, ..])
{
    Console.WriteLine("数组以 1,2 开头");
}

// 更复杂的匹配:匹配具体结构的数组
if (numbers is [_, 2, 3, _, _])
{
    Console.WriteLine("数组第二个元素为 2,第三个元素为 3");
}

 

 

4️⃣ 泛型数学支持(Generic Math via Static Abstract Members in Interfaces)

    • 作用:
      利用接口中的静态抽象成员特性,实现类型安全的泛型数学运算,使得算法能够与数值类型无关而编写。

    • 优势:
      允许开发者在编译时就能确保数学运算的正确性,并能为各种数值类型提供统一的操作接口(在 .NET 7 中,内置数值类型已经支持这一特性)。

    • 示例:

// 定义一个支持加法运算的接口
public interface IAddable<TSelf>
    where TSelf : IAddable<TSelf>
{
    static abstract TSelf operator +(TSelf left, TSelf right);
}

// 编写泛型方法,要求 T 类型必须实现加法操作
T Add<T>(T a, T b) where T : IAddable<T> => a + b;

int sum = Add(3, 4);  // 编译器会选择适当的加法实现,结果为 7
Console.WriteLine(sum);

 

 

5️⃣ UTF-8 字符串字面量

    • 作用:
      在字符串字面量后加上 u8 后缀,可以直接生成 UTF-8 编码的只读字节序列(ReadOnlySpan<byte>),避免在运行时进行编码转换。

    • 优势:
      对于高性能或需要直接处理原生 UTF-8 数据的场景非常有用,可以减少内存分配和提高效率。

    • 示例:

ReadOnlySpan<byte> utf8Data = "Hello, UTF-8!"u8;
// utf8Data 已采用 UTF-8 编码存储
Console.WriteLine(utf8Data.Length); // 输出字节数

 

总结

C# 11 主要新增并改进了以下功能:

  • 原始字符串字面量:简化多行字符串和复杂格式字符串的书写,并支持插值。
  • required 成员:强制对象初始化时赋值必需的成员,提升类型安全性。
  • 列表模式:扩展模式匹配功能,使对数组或集合的结构匹配更加直观。
  • 泛型数学支持:利用静态抽象成员在接口中的应用,实现类型安全且通用的数学运算。
  • UTF-8 字符串字面量:直接生成 UTF-8 编码的字符串数据,适用于高性能场景。

 

posted on 2025-02-07 21:02  淡若轻风  阅读(86)  评论(0)    收藏  举报