擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
擴展方法編寫代碼:
namespace ExtensionMethods { public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }
1.必需為靜態方法
2.第一個參數為向哪個類型添加擴展方法(this 類型名稱 行參名稱)
調用時引入命名空間:
using ExtensionMethods;
調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異:
string s = "Hello Extension Methods"; int i = s.WordCount();
注意:在代碼中,可以使用實例方法語法調用該擴展方法。 但是,編譯器生成的中間語言 (IL) 會將代碼轉換為對靜態方法的調用。 因此,並未真正違反封裝原則。 實際上,擴展方法無法訪問它們所擴展的類型中的私有變量。
可以使用擴展方法來擴展類或接口,但不能重寫擴展方法。 與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用。 編譯時,擴展方法的優先級總是比類型本身中定義的實例方法低。 換句話說,如果某個類型具有一個名為 Process(int i) 的方法,而你有一個具有相同簽名的擴展方法,則編譯器總是綁定到該實例方法。當編譯器遇到方法調用時,它首先在該類型的實例方法中尋找匹配的方法。 如果未找到任何匹配方法,編譯器將搜索為該類型定義的任何擴展方法,並且綁定到它找到的第一個擴展方法。
通常,建議你只在不得已的情況下才實現擴展方法,並謹慎地實現。