標籤:style blog ar color os 使用 sp strong on
擴充方法使你能夠向現有類型“添加”方法,而無需建立新的衍生類別型、重新編譯或以其他方式修改原始類型。 擴充方法是一種特殊的靜態方法,但可以像擴充類型上的執行個體方法一樣進行調用。 以上是msdn官網對擴充方法的描述,現在我通過一個情景例子來對此進行闡釋。假設一個控制台程式class Program{}裡面的主函數如下:
1 static void Main(string[] args)2 {3 DateTime now = DateTime.Now;4 string time = now.ToString("yyyy-mm-dd hh:mm:ss"); 5 Console.WriteLine(time);6 Console.ReadKey();7 }
假設需求變了,日期的顯示格式要變成"yyyy-mm-dd"這種格式,當然只需要初始化time時按下面寫法改寫即可:
string time = now.ToString("yyyy-mm-dd");
但是如果要改變日期格式的有很多個類呢?每個都要改一次嗎?這樣一旦需求變來變去就忙死人了。傳統的解決方式是封裝一個協助類,在裡面寫方法,然後供其他類調用。
本例在當前項目模仿添加一個DateHelper類:public class DateHelper{},在類裡面定義方法:
1 public static string DateToString(DateTime dt)2 {3 return dt.ToString("yyyy-mm-dd hh:mm:ss");4 }
於是原來的主函數改寫如下:
1 static void Main(string[] args)2 {3 DateTime now = DateTime.Now;4 string time = DateHelper.DateToString(now);5 Console.WriteLine(time);6 Console.ReadKey();7 }
此時如果變需求,只需要改寫DateHelp類裡的DateToString()方法就行了,不管有多少個類調用此方法,都會被影響。問題解決了,可是這樣要調用另一個類的方法,還是有點麻煩,有沒有什麼方法能夠讓我們像now.DateToString()一樣直接調用呢?當然DateTime是微軟寫好的,我們改不了,無法建立想要的執行個體方法,於是,便引出了擴充方法。
下面是擴充方法的要素:
1.此方法必須是一個靜態方法
2.此方法必須放在靜態類中
3.此方法的第一個參數必須以this開頭,並且指定此方法是擴充自哪個類型
根據以上要素,我們DateHelper類改成靜態類:public static class DateHelper{} ,同時改寫DateToString()方法:
1 public static string DateToString(this DateTime dt)2 {3 return dt.ToString("yyyy-mm-dd hh:mm:ss");4 }
此時回到主函數方法體,輸入"now."便可以看見自動提示有個DateToString()方法,於是代碼可以這樣寫:
1 static void Main(string[] args)2 {3 DateTime now = DateTime.Now; 4 string time = now.DateToString();5 Console.WriteLine(time);6 Console.ReadKey();7 }
顯而易見,這樣用起來會更加便捷,而且這樣讓我們看起來確實就像是被擴充類型本身具有的執行個體方法一樣,可讀性很高。下面概括一下擴充方法的特點:
1.擴充方法擴充自哪個類型,就必須是此類型的變數來使用,其他類型無法使用,本例擴充自DateTime類型,就只能是被DateTime類型的變數.出來(now.DateToString())
2.擴充方法中的this後面的參數不屬於方法的參數,本例是無參數,this後面的DateTime dt是指明擴充方法擴充自何種類型
3.如果擴充方法和執行個體方法具有相同的簽名,則優先調用執行個體方法
4.擴充自父類上的方法,可以被子類的對象直接使用
5.擴充自介面上的方法,可以被實作類別的對象直接使用
6.擴充方法最終還是被編譯器編譯成:靜態類.靜態方法(),本例中now.DateToString()最終還是會被編譯成DateHelper.DateToString(now),這是它的本質
實際上,我們可能會遇到這樣的情景,如在介面擴充一個方法的時候,所有的原本已實現該介面的類都要實現新擴充的方法,這樣的改動是一個很麻煩的工作,可以使用擴充方法“曲線救國”;而有時候我們想為某個類添加新方法卻不想改動這個類,那麼擴充方法這種“偽添加”方法的方式就體現出它的價值了。最常見的擴充方法是LINQ標準查詢運算子,運用廣泛,這種方便快捷的方式理應博得碼農們點1024個贊。
[轉] C# 中的擴充方法