1.定義:
擴展方法使你能夠向現有類型“添加”方法,而無需創(chuàng)建新的派生類型周伦、重新編譯或以其他方式修改原始類型郑现。 擴展方法是一種特殊的靜態(tài)方法湃崩,但可以像擴展類型上的實例方法一樣進行調用。
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);
}
//擴充一個帶參數的方法
public static void ChangeName(this Person obj, string name)
{
obj.name = name;
}
}
擴展方法被定義為靜態(tài)方法接箫,但它們是通過實例方法語法進行調用的攒读。 它們的第一個參數指定該方法作用于哪個類型,并且該參數以 this
修飾符為前綴辛友。
3. 調用擴展方法
Person p1 = new Person();
p1.name = "asdasd";
p1.sayHellow();
p1.ChangeName("張三");
在代碼中薄扁,可以使用實例方法語法調用該擴展方法。 但是废累,編譯器生成的中間語言 (IL) 會將代碼轉換為對靜態(tài)方法的調用邓梅。 因此,并未真正違反封裝原則邑滨。 實際上日缨,擴展方法無法訪問它們所擴展的類型中的私有變量。
定義和調用擴展方法注意點
- 定義一個靜態(tài)類以包含擴展方法掖看。
- 將該擴展方法實現為靜態(tài)方法殿遂,并使其至少具有與包含類相同的可見性诈铛。
- 該方法的第一個參數指定方法所操作的類型;該參數必須以 this修飾符開頭墨礁。
- 按照與調用類型上的實例方法一樣的方式調用擴展方法。
- 只能擴展對象類
4 為接口添加擴展方法
接口定義
public interface Interface1
{
void test1();
}
為接口擴展方法
public static class MethedExt
{
public static void test2(this Interface1 iter)
{
Console.WriteLine("test2");
}
}
實現接口中的方法
public class Person : Interface1
{
public string name;
private int age;
public override string ToString()
{
return this.name;
}
public void test1()
{
}
}
調用擴展的接口方法
static void Main(string[] args)
{
Person p1 = new Person();
p1.name = "asdasd";
p1.test2();
}
5耳峦、使用注意
可以使用擴展方法來擴展類或接口恩静,但不能重寫擴展方法。
與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用蹲坷。
編譯時驶乾,擴展方法的優(yōu)先級總是比類型本身中定義的實例方法低。 換句話說循签,如果某個類型具有一個名為 SayHellow()的方法级乐,而你有一個具有相同簽名的擴展方法,則編譯器總是綁定到該實例方法县匠。 當編譯器遇到方法調用時风科,它首先在該類型的實例方法中尋找匹配的方法。 如果未找到任何匹配方法乞旦,編譯器將搜索為該類型定義的任何擴展方法贼穆,并且綁定到它找到的第一個擴展方法。
牢記一點: 如果擴展方法與該類型中定義的方法具有相同的簽名兰粉,則擴展方法永遠不會被調用故痊。
6、一點建議:
通常玖姑,建議你只在不得已的情況下才實現擴展方法愕秫,并謹慎地實現。 只要有可能焰络,必須擴展現有類型的客戶端代碼都應該通過創(chuàng)建從現有類型派生的新類型來達到這一目的戴甩。
在使用擴展方法來擴展你無法更改其源代碼的類型時,你需要承受該類型實現中的更改會導致擴展方法失效的風險舔琅。
7等恐、小練習
為
int[]
擴充一個方法,調用這個方法备蚓,可以實現打印數組中的元素