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 编码的字符串数据,适用于高性能场景。
浙公网安备 33010602011771号