类的扩展方法

C#当中的扩展方法

 

  先说有用的,c#扩展方法结论:html

  扩展方法可以向现有类型“添加”方法,而无需建立新的派生类型,从新编译或以其余方式修改原始类型。扩展方法必须是静态方法,能够像实例方法同样进行调用。且调用同名中实际定义的方法优先级要高于扩展方法。c#

  先来个简单的例子:post

1
2
3
4
5
6
7
8
9
public static class test
     {
         public static int CountYourNumber( this string str)
         {
             return str.Split( new char [] { ' ' , '.' , '?' },
                 StringSplitOptions.RemoveEmptyEntries).Length;
         }
     }
}

  这里我定义了一个测试类,CountYourNumber方法做为string类型的扩展方法。当中第一个参数前面出现一个this,这表示对string中添加扩展方法,在调用该接口时,能够调用到该扩展方法。测试

1
2
3
4
5
public static void testMethod()
{
     string s = "Hello Extension Methods,I`m learning you" ;
     int alphabetNum = s.CountYourNumber();
}

  这里alphabetNum接收到的是s的字母数量。s是定义的一个字符串,这里能够看出,咱们本身写的扩展方法能够在这里调用,会有一个(扩展)字样,注意这里调用方法时不须要传参数。截图:this

  在咱们实际应用中也很普遍,举个咱们经常使用的例子:linq标准查询,或者找到Queryable类,截图以下:url

  这些都是微软写好的扩展方法,注意:这些方法里的第二个参数是须要在扩展方法里传入的第一个参数。Expression<func<TSourse,int>> selector这种是须要传入一个lambda表达式的。而第一个参数,就是须要扩展的类。spa

分割线------------------------------------------------------------------code

  扩展方法与其扩展的类之间并无什么本质的联系,最终编译器仍是将扩展方法转化成静态类的静态方法调用,因此扩展方法不能访问相应类的私有字段和私有方法;至于为何使用静态类的静态方法,有一种说法是这样效率相对较高,同时扩展方法做为其余类的扩展,自己类的实例化没有什么意义。htm

相关文章
相关标签/搜索