.NET 10 C# 14 New Features 新增功能介绍-扩展成员Extension Members
一、从扩展方法到扩展成员早在 C# 3.0 中就引入了“扩展方法Extension Methods”其底层机制是必须定义在 static class方法必须是 static第一个参数使用 this Tpublic static class StringExtensions { public static bool IsNullOrEmptyEx(this string value) string.IsNullOrEmpty(value); }从本质上看编译器在语法层面做“糖化处理”最终仍然是静态方法调用。LINQ就是最大的应用场景。二、C# 14中引入扩展成员和示例说明C# 14 允许在更自然的语法结构中声明扩展成员不再局限于“静态类 this 参数”模式而是支持类似public static class Enumerable { // Extension block extensionTSource(IEnumerableTSource source) // extension members for IEnumerableTSource { // Extension property: public bool IsEmpty !source.Any(); // Extension method: public IEnumerableTSource Where(FuncTSource, bool predicate) { ... } } // extension block, with a receiver type only extensionTSource(IEnumerableTSource) // static extension members for IEnumerableSource { // static extension method: public static IEnumerableTSource Combine(IEnumerableTSource first, IEnumerableTSource second) { ... } // static extension property: public static IEnumerableTSource Identity Enumerable.EmptyTSource(); // static user defined operator: public static IEnumerableTSource operator (IEnumerableTSource left, IEnumerableTSource right) left.Concat(right); } }定义的是一个 extension block目标类型是IEnumerableTSource代码分成两类 extension block实例扩展成员静态扩展成员① 实例扩展成员extensionTSource(IEnumerableTSource source)source 是接收者receiver类似旧语法的 this IEnumerableTSource source但语法更接近真正“为类型添加成员”扩展属性public bool IsEmpty !source.Any();编译器会生成public static bool get_IsEmptyTSource(IEnumerableTSource source)代码调用list.IsEmpty会被编译为Enumerable.get_IsEmpty(list)其本质仍然是静态方法 语法糖绑定但在语义层面它已经不再是“工具方法”而是“类型能力”。扩展方法public IEnumerableTSource Where(FuncTSource, bool predicate)即增强原有LINQ的Where功能如果系统中已有 System.Linq.Enumerable.Where实例成员优先然后才是 extension block再是 using 引入的扩展方法不会破坏已有 API只是参与候选集。② 静态扩展成员extensionTSource(IEnumerableTSource)这里没有 receiver 变量名。为类型本身添加“静态扩展成员”找一个静态扩展方法public static IEnumerableTSource Combine(...)代码调用IEnumerableint.Combine(a, b);编译器会转化为Enumerable.Combine(a, b);再看一个静态扩展属性public static IEnumerableTSource Identity代码调用IEnumerableint.Identity这在旧扩展方法体系中是无法表达的。再看一个扩展运算符public static IEnumerableTSource operator 这是 C# 14 的重大增强点。现在你可以写var result list1 list2;等价于Enumerable.op_Addition(list1, list2);三、底层编译机制不修改 CLR 元数据不改变 IEnumerableT不增加真实成员IL 仍然是静态方法所有成员都会生成 public static ...语义绑定由编译器完成扩展成员解析规则实例真实成员同 namespace extension blockusing 导入 extension block四、与传统扩展方法对比