C#扩展方法

一、基本概念

         1. 定义:

         扩展方法被定义为静态方法,但它们是通过实例方法的语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符作为前缀。扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。

         2. 作用:

         扩展方法能够向现有类型(存在的类)“添加”方法,而无需创建新的派生类型、重新编译或其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

         3.通俗理解:

         一般来说,int数据类型有个Tostring的方法,就是把int数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符A,那么之前的Tostring就不好使了,因为他只是我们的int数据转换为string类型的,却并不能添加一个字母a,所以这就要用到所谓的扩展方法了。

         比如,我给现有的类型增加一个扩展方法。我们想给string类型增加一个Add方法,该方法的作用是给字符串增加一个字母A。

         代码如下:

  1.  //必须是静态类才可以添加扩展方法  
  2.        Static class Program  
  3.        {  
  4.         static void Main(string[] args)  
  5.         {  
  6.             string str = "quzijing";  
  7. //注意调用扩展方法,必须用对象来调用   
  8.             string Newstr = str.Add();  
  9.             Console.WriteLine(Newstr);  
  10.             Console.ReadKey();  
  11.         }  
  12. //声明扩展方法  
  13.         //扩展方法必须是静态的,Add有三个参数  
  14.         //this 必须有,string表示我要扩展的类型,stringName表示对象名  
  15.         //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可  
  16.         public static  string  Add(this string stringName)  
  17.         {  
  18.             return stringName+"a";  
  19.         }  
  20. }

         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. 是一种编译技术,注意与反射等运行时技术进行区别,慎重使用!

猜你喜欢

转载自www.cnblogs.com/yzm-code/p/9138149.html