//先看幾個例子
//為StringBuilder擴展一個Indexof方法和一個ToUpper方法 public static class StringBuilderExtensions {
//該擴展方法返回字符首次出現的索引 public static int Indexof(this StringBuilder sb, Char values) { for (int index = 0; index < sb.Length; index++) { if (sb[index] == values) { return index; } } return 789686; }
//將小寫轉為大寫 public static string ToUpper(this StringBuilder sb)//這個方法並沒有幾毛錢意義。。。 { return sb.ToString().ToUpper(); } }
//創建一個靜態類
//擴展一個ShowIteam方法,分行打印
//任何表達式只要它最終的類型實現了IEnumerable<T>接口即可調用該方法 static public class A { public static void ShowIteams<T>(this IEnumerable<T> collection) { foreach (var item in collection) { Console.WriteLine(item); } } }
namespace 枚舉 { class Program { static void Main(string[] args) { StringBuilder sb = new StringBuilder("abcd,1234/efg"); int index1 = StringBuilderExtensions.Indexof(sb.Replace('/', '.'), '.'); string index2 = StringBuilderExtensions.ToUpper(sb); Console.WriteLine(index2); Console.WriteLine(index1); //單獨顯示每個char "Grant".ShowIteams(); //單獨顯示每個string new[] { "abc", "bcd", "cde" }.ShowIteams(); //單獨顯示每個int new[] { 1, 2, 3, 4 }.ShowIteams(); Console.ReadKey();
//輸出結果依次為
//ABCD,1234.EFG
//9
//G
//r
//a
//n
//t
//abc
//bcd
//cde
//1
//2
//3
//4
} } }
以上為幾個擴展方法的例子 曹衍濤
以下為關於擴展方法的一些規則和原則:
1.c#只支持擴展方法,不支持擴展屬性、擴展事件、擴展操作符等
2.擴展方法(第一個參數前面有this的方法)必須在非泛型的靜態類中聲明。類名沒有限制,可以隨便起。擴展方法至少有一個參數,而且只有第一個參數能用this關鍵字標記
3.c#編譯器查找靜態類中的定義擴展方法時,要求這些靜態類本身必須具有文件作用域。如果靜態類鑲嵌在另一個類中會報錯。
4.由於靜態類可以取任何名字,所以c#編譯器要花一定時間類來尋找擴展方法,他必須檢查文件作用域中的所有靜態類,並掃描他們所有的靜態方法來查找一個匹配。
5.多個靜態類可以定義相同的擴展方法。當編譯器檢測到存在兩個或多個擴展方法需要顯示指定靜態類的名稱,告訴編譯器要調用哪個方法。
6.用一個擴展方法擴展一個類時,同時也擴展了派生類型。所以不要將System.Object用作擴展方法的第一個參數,否則這個方法在所有表達式類型上都能調用。
7.擴展方法有潛在版本控制問題,加入未來Microsoft為StringBulider類添加了一個IndexOf實例方法,而且與上述代碼師徒調用的原型一樣,編譯器會用Microsoft的方法