C# 12 在 .NET 8 正式版中已经正式发布,为开发者带来了不少新功能和改进,进一步提升了代码的简洁性、表达力和类型安全性。
下面总结几个主要新增功能及其示例:
1️⃣ 主构造函数(Primary Constructors for Non-Record Classes)
-
功能简介:
以前主构造函数的语法主要用于记录类型(record types),而 C# 12 扩展到了普通类。现在你可以在类声明时直接在括号中定义构造参数,编译器会自动生成只读属性,从而减少样板代码。 -
示例:
// 传统写法:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
// C# 12 新写法:直接在类头部声明构造参数
public class Person(string Name, int Age)
{
// 你可以在类体内添加其他成员或方法
public void Deconstruct(out string name, out int age) => (name, age) = (Name, Age);
}
var p = new Person("Alice", 30);
Console.WriteLine(p.Name); // 输出:Alice
2️⃣ 改进的参数空值检查语法(Enhanced Parameter Null-Checking)
-
功能简介:
为了减少手动编写冗余的 null 检查代码,C# 12 提供了一种更简洁的语法来自动对方法参数进行空值检查。虽然最终语法可能会有所调整,但目前预览版本中讨论的方案之一是直接在参数后添加特殊标记(例如!!),表示参数必须不为 null。 -
示例(预期语法,实际请以官方发布为准):
// 假设可以这样写:如果 s 为 null,编译器自动生成抛出 ArgumentNullException 的代码
public void Process(string s!!, int count)
{
// 此处 s 已经保证不为 null
Console.WriteLine(s + count);
}
3️⃣ 增强的插值字符串处理(Enhanced Interpolated String Handling)
-
功能简介:
C# 12 对插值字符串(Interpolated Strings)进行了底层改进,不仅优化了性能,还允许开发者自定义插值字符串处理器,从而实现更灵活的格式化行为。 -
示例:
var name = "Bob";
var message = $"Hello, {name}! Today is {DateTime.Now:yyyy-MM-dd}.";
// 在 C# 12 中,背后可能会使用更高效的插值字符串处理机制
Console.WriteLine(message);
开发者也可以定义自定义的插值字符串处理器(Interpolated String Handlers),以满足特定的格式化需求,具体用法可参考官方文档。
4️⃣ 列表/集合模式的改进(Enhanced List/Collection Patterns)
-
功能简介:
C# 12 在模式匹配方面进一步扩展,特别是对数组和集合的匹配。新特性支持使用列表模式捕获部分元素以及剩余部分,从而使匹配语法更灵活直观。 -
示例:
int[] numbers = { 1, 2, 3, 4, 5 };
// 检查数组是否以 1, 2 开头,并捕获剩余元素
if (numbers is [1, 2, .. var rest])
{
Console.WriteLine($"数组以 1,2 开头,剩余元素个数:{rest.Length}");
}
// 也可以进行更精细的模式匹配
if (numbers is [_, 2, 3, _, _])
{
Console.WriteLine("数组的第二个元素为 2,第三个元素为 3");
}
5️⃣ 泛型数学支持(Generic Math via Static Abstract Members in Interfaces)
-
功能简介:
利用接口中的静态抽象成员,C# 12 允许开发者在泛型代码中直接定义数学运算接口。这使得可以编写与具体数值类型无关的数学算法,同时获得编译期的类型安全和优化。 -
示例:
// 定义一个支持加法运算的接口(.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);
6️⃣ UTF-8 字符串字面量
-
功能简介:
在字符串字面量后添加u8后缀,可以直接生成 UTF-8 编码的只读字节序列(ReadOnlySpan<byte>),适用于性能敏感或需要处理原生 UTF-8 数据的场景。 -
示例:
ReadOnlySpan<byte> utf8Data = "Hello, UTF-8!"u8;
// utf8Data 已经以 UTF-8 编码存储
Console.WriteLine(utf8Data.Length); // 输出字节数
总结
C# 12 的新增功能主要集中在以下几个方面:
- 减少样板代码:通过主构造函数语法让普通类的构造函数声明更简洁。
- 提升代码安全性:改进的参数空值检查语法可以自动生成参数检查代码,减少遗漏空值检查的风险。
- 优化字符串处理:增强的插值字符串处理和 UTF-8 字符串字面量让处理字符串数据更加高效和灵活。
- 扩展模式匹配能力:列表/集合模式的改进使得对数组和集合的结构匹配更直观。
- 泛型数学支持:允许在泛型代码中统一实现数学运算,增强了代码的通用性和类型安全。
浙公网安备 33010602011771号