C#14中的新关键字 extension 与扩展成员
C#14语法中,新增了两个上下文关键字:extension 和 field,field 关键字在C#13预览中已经有体现,这里重点总结一下 extension 关键字的用法。
说到 extension,就必须要提一下C#14中的新概念:扩展块。
众所周知,在先前的语法版本中,要定义一个【扩展方法】,必须采用如下的形式:
1 public static class MyExtOld //MyExtNew的等同类 2 { 3 public static int Add(this int receiver, int i) => i + receiver; 4 public static int Sub(this int receiver) => --receiver; 5 public IEnumerable<TReceiver> Spread(this IEnumerable<TReceiver> receiver, int start, int count) => receiver.Skip(start).Take(count); 6 }
上面的示例中,定义了3个扩展方法:Add、Sub、Sqread。
从C#14开始,引入【扩展块】的概念。
扩展块:通俗解释就是包含扩展成员的代码块,使用 extension 关键字来定义,关键字的用法与 switch 关键字形式十分接近。
扩展成员:扩展块中的成员,包含扩展方法、扩展属性;而且,成员既可以是静态成员,也可以是动态成员。
上面的扩展方法,使用扩展块,如下所示:
1 public static class MyExtNew //定义扩展成员(扩展块)的类:顶级(非嵌套)、非泛型、静态 2 { 3 //《扩展成员(C# 编程指南)》 4 //https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods 5 //《扩展声明(C# 参考)》-- extension 关键字 6 //https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/extension 7 8 //普通扩展块 9 extension(int receiver) //int:接收方类型,可以是 类、接口、结构(结构类型前要加ref),receiver:接收方参数 10 { 11 //扩展块中可以放:方法(对应旧“扩展方法”)、属性(New),可动态也可静态。 12 public int Add(int i) => i + receiver; //动态扩展方法 13 public static int Sub() => --receiver; //静态扩展方法 14 public IEnumerable<int> Identity => Enumerable.Empty<int>(); 15 public static IEnumerable<int> Identity => Enumerable.Empty<int>(); 16 } 17 18 //泛型扩展块 19 extension<TReceiver>(IEnumerable<TReceiver> receiver) 20 { 21 public IEnumerable<TReceiver> Spread(int start, int count) 22 => receiver.Skip(start).Take(count); 23 } 24 }
扩展成员的调用方式,则是和之前扩展方法一样:
internal class Program { static void Main(string[] args) { int num = 10; num.Add(1); //调用动态成员 MyExtNew.Sub(num); //调用静态成员 } }
注意:
可以使用扩展成员来扩展类或接口或结构,但不能替代类中定义的行为。
与接口或类成员同名且签名相同的扩展成员永远不会被调用。
在编译时,扩展成员的优先级始终低于类型本身中定义的实例(或静态)成员。
参考文献:
1、《扩展成员(C# 编程指南)》
https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
2、《扩展声明(C# 参考)》-- extension 关键字
https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/extension
浙公网安备 33010602011771号