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

posted @ 2025-07-23 22:57  syzcyyx  阅读(224)  评论(0)    收藏  举报