1 簡介:
擴展方法使你能夠向現(xiàn)有類型“添加”方法呻畸,而無需創(chuàng)建新的派生類型写穴、重新編譯或以其他方式修改原始類型玄组。 擴展方法是一種特殊的靜態(tài)方法整以,但可以像擴展類型上的實例方法一樣進行調(diào)用胧辽。
2.定于擴展方法
Personl類的定義
public class Person
{
public string name;
public override string ToString()
{
return this.name;
}
}
為Person類擴展方法
public static class MethedExt
{
public static void sayHellow(this Person obj)
{
Console.WriteLine("Say Hellow" + obj.name);
}
}
擴展方法被定義為靜態(tài)方法,但它們是通過實例方法語法進行調(diào)用的公黑。 它們的第一個參數(shù)指定該方法作用于哪個類型邑商,并且該參數(shù)以 this 修飾符為前綴。
3. 調(diào)用擴展方法
Person p1 = new Person();
p1.name = "asdasd";
p1.sayHellow();
在代碼中凡蚜,可以使用實例方法語法調(diào)用該擴展方法人断。 但是,編譯器生成的中間語言 (IL) 會將代碼轉(zhuǎn)換為對靜態(tài)方法的調(diào)用朝蜘。 因此恶迈,并未真正違反封裝原則。 實際上谱醇,擴展方法無法訪問它們所擴展的類型中的私有變量暇仲。
定義和調(diào)用擴展方法注意點
定義一個靜態(tài)類以包含擴展方法。
將該擴展方法實現(xiàn)為靜態(tài)方法副渴,并使其至少具有與包含類相同的可見性奈附。
該方法的第一個參數(shù)指定方法所操作的類型;該參數(shù)必須以 this修飾符開頭煮剧。
在調(diào)用代碼中斥滤,添加一條 using指令以指定包含擴展方法類的命名空間。
按照與調(diào)用類型上的實例方法一樣的方式調(diào)用擴展方法勉盅。
4 為接口添加擴展方法
接口定義
public interface Interface1
{
void test1();
}
為接口擴展方法
public static class MethedExt
{
public static void test2(this Interface1 iter)
{
Console.WriteLine("test2");
}
}
實現(xiàn)接口中的方法
public class Person : Interface1
{
public string name;
private int age;
public override string ToString()
{
return this.name;
}
public void test1()
{
}
}
調(diào)用擴展的接口方法
static void Main(string[] args)
{
Person p1 = new Person();
p1.name = "asdasd";
p1.test2();
}
5佑颇、使用注意
可以使用擴展方法來擴展類或接口,但不能重寫擴展方法草娜。
與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調(diào)用挑胸。
編譯時,擴展方法的優(yōu)先級總是比類型本身中定義的實例方法低宰闰。 換句話說嗜暴,如果某個類型具有一個名為 SayHellow()的方法,而你有一個具有相同簽名的擴展方法议蟆,則編譯器總是綁定到該實例方法闷沥。 當編譯器遇到方法調(diào)用時,它首先在該類型的實例方法中尋找匹配的方法咐容。 如果未找到任何匹配方法舆逃,編譯器將搜索為該類型定義的任何擴展方法,并且綁定到它找到的第一個擴展方法。
牢記一點: 如果擴展方法與該類型中定義的方法具有相同的簽名路狮,則擴展方法永遠不會被調(diào)用虫啥。
6、一點建議:
通常奄妨,建議你只在不得已的情況下才實現(xiàn)擴展方法涂籽,并謹慎地實現(xiàn)。 只要有可能砸抛,必須擴展現(xiàn)有類型的客戶端代碼都應該通過創(chuàng)建從現(xiàn)有類型派生的新類型來達到這一目的评雌。
在使用擴展方法來擴展你無法更改其源代碼的類型時,你需要承受該類型實現(xiàn)中的更改會導致擴展方法失效的風險直焙。
作者:silence_k
鏈接:http://www.reibang.com/p/247ab6b373a4
來源:簡書
著作權(quán)歸作者所有景东。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處奔誓。