C# 15 随 .NET 11 发布,最核心的里程碑是原生联合类型(Union Types),同时补齐集合表达式传参、主构造函数增强、运行时异步等关键能力,整体方向:类型系统大升级、语法更精简、异步更快、模式匹配更强。

一、联合类型(Union Types ⭐⭐⭐⭐⭐,史诗级特性)

作用

用 union 关键字定义 “一个值只能是多种类型之一” 的封闭类型,编译器强制 switch 穷举所有情况,彻底替代 OneOf、异常流、基类 / 接口模拟,类型安全拉满。

完整示例

// 定义多个记录类型
	public record class Cat(string Name);
	public record class Dog(string Name);
	public record class Bird(string Name);
	// C#15:声明联合类型 Pet,只能是 Cat/Dog/Bird 之一
	public union Pet(Cat, Dog, Bird);
	// 使用
	Pet pet = new Dog("Rex");
	// 编译器强制穷举所有类型,漏写会报错
	string name = pet switch{
	Dog d => d.Name,
	Cat c => c.Name, 
	Bird b => b.Name
	};

进阶:带泛型的结果类型(API 错误处理神器)

// 定义泛型联合类型,替代异常+try-catch
public union Result<T>(Success<T>, NotFound, ValidationError);
	public record Success<T>(T Data);
	public record NotFound(string Message);
	public record ValidationError(string Error);// 模拟数据库查询
	Result<User> GetUser(int id){
	var user = db.Users.Find(id);
	if (user == null) return new NotFound("用户不存在");
	return new Success<User>(user);
	}
	// 模式匹配处理结果,无异常、类型安全
	var result = GetUser(1);
	var response = result switch{ 
	Success<User> s => Ok(s.Data),
	NotFound n => NotFound(n.Message),
	ValidationError v => BadRequest(v.Error)
	};

核心优势

  • 封闭类型集:外部无法新增类型,比接口 / 基类更安全;
  • 隐式转换:自动从成员类型转联合类型,无需手动包装;
  • 穷举检查:switch 必须覆盖所有类型,编译期杜绝遗漏;
  • 无继承限制:成员类型无需共享基类,可任意组合(如 string | int | Exception)。

二、集合表达式参数(⭐⭐⭐⭐,性能 + 语法双优化)

作用

集合表达式(如 [1,2,3])支持 with(...) 子句,直接向底层集合(List/Dictionary<TKey,TValue>)的构造函数传参(容量、比较器等),避免二次扩容与冗余代码。

示例

// C#15:with 指定初始容量,避免多次扩容
var list = [with(capacity: 20), 1, 2, 3, 4, 5];
// 字典:指定容量+自定义比较器
var dict = [with(capacity: 10, comparer: StringComparer.OrdinalIgnoreCase),
		"name" to "张三",
		"age" to "30"
	];
// 直接传参给方法,零分配(配合 Span)
Process([with(capacity: 4), 10, 20, 30, 40]);
void Process(ReadOnlySpan<int> span) { ... }

适用场景

高频集合初始化、高性能代码、需要指定容量 / 比较器的场景,减少 new List(capacity) 样板。

三、主构造函数增强(⭐⭐⭐⭐,类定义更简洁)

作用

主构造函数支持 init/required 修饰符,可直接声明不可变或必填参数,配合 record 使用更丝滑,减少手动属性声明。

示例

// C#15:主构造函数+init,属性只读
public class Person(string name, int age){ 
	public string Name { get; init; } = name; 
	public int Age { get; init; } = age;
}
// required 修饰符:必须在初始化时赋值
public class Product(required string id, decimal price){
	public string Id { get; } = id; 
	public decimal Price { get; } = price;
}
// 使用
var p = new Person("李四", 25);
var prod = new Product("P001", 99.9m);

四、Runtime Async(⭐⭐⭐⭐,异步性能大突破)

作用

重大运行时优化:async 状态机从 “编译器生成” 下沉到 “.NET 运行时原生支持”,减少 IL 代码量、降低堆栈开销、提升异步方法执行效率,无需改代码,直接提速。

优势

  • 异步方法启动更快、内存占用更少;
  • 堆栈跟踪更清晰,调试异步代码更轻松;
  • 高并发场景(WebAPI、网关、消息队列)性能提升明显。

五、扩展布局(Extension Layout ⭐⭐⭐,高性能内存操作)

作用

允许自定义值类型的内存布局,控制字段偏移量、对齐方式,适配底层硬件、网络协议、内存映射文件,替代手动 StructLayout 特性,更灵活。

示例

// C#15:扩展布局,手动指定字段偏移
[ExtensionLayout]
public struct PacketHeader{
	public byte Version;    // 偏移 0
	public ushort Length;   // 偏移 1(2字节对齐)
	public uint Checksum;   // 偏移 3
}

六、其他重要小特性

1. 模式匹配增强

联合类型与模式匹配深度整合,支持嵌套模式、属性模式、条件模式,复杂数据处理更简洁。

string Handle(Result<int> result) => result switch{
	Success<int> { Data: > 100 } => "高值", 
	Success<int> { Data: <= 100 } => "正常值",
	NotFound => "缺失",
	ValidationError v when v.Error.Contains("严重") => "严重错误", 
	_ => "未知"
};

2. 隐式 Span 转换优化

进一步增强 Span/ReadOnlySpan 与数组、字符串、集合的隐式转换,高性能代码更少写 AsSpan()。

3. 文件级命名空间优化

命名空间可直接作用于整个文件,无需嵌套,代码结构更扁平、易读。

4. 编译器性能提升

泛型推断、重载解析、语法检查速度加快,大型项目编译更快。

启用配置(.csproj)

<PropertyGroup>
	<TargetFramework>net11.0</TargetFramework>
	<LangVersion>15.0</LangVersion>
</PropertyGroup>

总结

C# 15 是类型系统与性能双飞跃的版本:联合类型彻底重塑错误处理与数据建模,集合表达式传参优化高频初始化,Runtime Async 大幅提升异步性能,配合主构造函数与模式匹配增强,让 C# 同时具备强类型安全、高开发效率、顶级性能。