C# 3.0 —— 扩展方法
扩展方法是C# 3.0新加入的特性,允许我们在不改变源代码的情况下扩展(即填加)现有类型中的实例方法,也给我们提供了另外一种扩展类型行为的方法(其它的方法为继承、组合、反射)。
下面我们来看一个代码示例:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
我们在Extensions类中定义了string类型的一个扩展方法SayTo(),从中我们可以看到扩展方法定义的几个特点:
1. 扩展方法的第一个参数有一个this关键字,就是这个this关键字才标识了这是个扩展方法。
2. 扩展方法的第一个参数是要扩展的类型,示例中扩展的是string类型。
3. 扩展方法只能在静态类中定义,而静态类中只能声明静态方法,因而扩展方法也都是静态的。
我们在Program类中使用了这个扩展方法,我们可以注意到我们用调用实例方法的方式调用了一个静态方法。在扩展方法的使用中我们应该注意到以下几个方面:
1.用类型的实例方法调用扩展方法时第一个参数不需要输入,输入了反而会报错。编译器在编译代码的时候实际上把s.SayTo("world")转化为了Extensions.SayTo(s, "world"),扩展方法的本质是将实例方法调用在编译期改为静态类中静态方法的调用。
2.扩展方法也可以用静态的方式调用,用Extensions.SayTo(s, "world")来取代s.SayTo("world"),效果是一样的。我们可以看一下IL代码
L_0008: ldstr "world"
L_000d: call void Extensions.Extensions::SayTo(string, string)
两个语句的调用都会产生这样相同的IL代码。
3.扩展方法有他的优先级,现有实例的方法的优先级最高,其次为最近的namespace下的扩展方法,最后为较远namespace下的扩展方法。
4.在进行类的设计的时候不要认为反正以后可以扩展,就不太认真的对待设计,这是不可取的。扩展方法一般用于扩展即有的,不易于修改的代码.