定義:擴展方法允許現存已編譯的類型和當前即將被編譯的類型在不需要被直接更新的情況下,獲得功能上的擴展。
為類型添加功能但並不擁有類型的已有代碼時;
當需要使類型支持一系列成員但不能改動類型的原始定義時。
說明:擴展方法不會真正改變編譯后的代碼,只是在當前應用程序的上下文中為類型增加成員
一、擴展方法定義
static class MyExtensions // ①方法定義在靜態類 { // ②擴展方法聲明為靜態的 public static void DisplayDefiningAssembly (this object obj) // ③使用this關鍵字對第一個參數修飾 { Console.WriteLine("{0} lives here:=> {1}\n",obj.GetType().Name,Assembly.GetAssembly(obj.GetType()).GetName().Name); } public static int ReverseDigits(this int i) { // 把int翻譯為string然后獲取所有字符 char[] digits = i.ToString().ToCharArray(); // 現在反轉數組中的項 Array.Reverse(digits ); // 放回string String newDigits = new string (digits ); // 最后以int返回修改后的字符串 return int.Parse(newDigits) } }
1)必須把方法定義在靜態類中
2)每個擴展方法也必須是靜態的
3)所有擴展方法都需要使用this關鍵字對第一個參數進行修飾(只對第一個參數)
4)每個擴展方法只能被內存中正確的實例調用,或通過其所處的靜態類被調用
二、使用擴展方法
1)在實例層次上調用擴展方法
int myInt =123456; myInt.DisplayDefiningAssembly(); ... //使用其他類型的實例調用擴展方法
2)靜態調用擴展方法
int myInt =123456; MyExtensions.DisplayDefiningAssembly(myInt);
說明:
①、擴展方法本質上是可以從擴展類型的實例上進行調用的靜態方法;只是一種語法糖
②、它和普通的方法不一樣,擴展方法不能直接訪問它們擴展的類型成員。擴展不是繼承
③、但是我們可以使用this限定的參數來訪問要擴展類型的所有公共成員(僅僅是公共成員)
④、只有對正確導入了擴展方法所在命名空間,才可以使用擴展方法
⑤、擴展方法支持智能感應,以一個向下的箭頭代指擴展方法
三、通過擴展方法擴展接口類型
需要對擴展的接口的擴展方法做實現定義
static class MyExtensions { // 擴展IBase 方法及其實現 public static int Sub(this IBase b, int x,int y) { return x-y; } }