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
示例
// 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
三、主构造函数增强(⭐⭐⭐⭐,类定义更简洁)
作用
主构造函数支持 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
3. 文件级命名空间优化
命名空间可直接作用于整个文件,无需嵌套,代码结构更扁平、易读。
4. 编译器性能提升
泛型推断、重载解析、语法检查速度加快,大型项目编译更快。
启用配置(.csproj)
<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<LangVersion>15.0</LangVersion>
</PropertyGroup>
总结
C# 15 是类型系统与性能双飞跃的版本:联合类型彻底重塑错误处理与数据建模,集合表达式传参优化高频初始化,Runtime Async 大幅提升异步性能,配合主构造函数与模式匹配增强,让 C# 同时具备强类型安全、高开发效率、顶级性能。