先说有用的,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