一、基本概念
1. 定义:
扩展方法被定义为静态方法,但它们是通过实例方法的语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符作为前缀。扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。
2. 作用:
扩展方法能够向现有类型(存在的类)“添加”方法,而无需创建新的派生类型、重新编译或其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
3.通俗理解:
一般来说,int数据类型有个Tostring的方法,就是把int数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符A,那么之前的Tostring就不好使了,因为他只是我们的int数据转换为string类型的,却并不能添加一个字母a,所以这就要用到所谓的扩展方法了。
比如,我给现有的类型增加一个扩展方法。我们想给string类型增加一个Add方法,该方法的作用是给字符串增加一个字母A。
代码如下:
- //必须是静态类才可以添加扩展方法
- Static class Program
- {
- static void Main(string[] args)
- {
- string str = "quzijing";
- //注意调用扩展方法,必须用对象来调用
- string Newstr = str.Add();
- Console.WriteLine(Newstr);
- Console.ReadKey();
- }
- //声明扩展方法
- //扩展方法必须是静态的,Add有三个参数
- //this 必须有,string表示我要扩展的类型,stringName表示对象名
- //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可
- public static string Add(this string stringName)
- {
- return stringName+"a";
- }
- }
4. 总结
在编程中,我们要使用很多很多的类库,这些类库有的是我们自己开发的,有的是别人的代码,有的是第三方发布的,我们不仅没有他们的代码,连看的机会都没有。然而作为.net
程序员,我们每天都要和BCL(Base Class Linbrary)打交道。无疑,BCL做为一个年轻的框架类库,她是成功的,但是还有一些时候我们还是得写一些“Helper”方法来扩展类库,由于我们不能修改类库的源代码,我们只有写一个个的静态类。
二、扩展方法的优缺点
1. 优点:
使用扩展方法明显比使用传统方法要简单,不需要实例化,修改方法也不需要重新修改和编译。
2. 缺点:
1).是静态方法,使用不当会造成“污染”。
2).不具有override的能力,不会重载原有的方法。
3).扩展方法会被扩展类的同名方法覆盖,所以实现扩展方法我们需要承担随时被覆盖的风险。
4).扩展方法不能访问被扩展类的私有成员。
5).扩展方法只能用实例来调用,不能像普通的静态方法一样使用类名调用;
6).只有引入扩展方法坐在的命名空间后,扩展方法才可以使用。
三、 扩展方法的本质
1. 将实例方法调用在编译期改变为静态类中的静态方法调用,实际上扩展方法确实拥有静态方法所具有的所有功能。
2. 作用域是整个namespace可见的,并通过使用Using namespace来导入其他命名空间中的扩展方法
3. 优先级:现有实例方法的优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较为远的namespace下的静态类的静态方法。
4. 是一种编译技术,注意与反射等运行时技术进行区别,慎重使用!