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