什麼是擴充方法?回答這個問題之前,先看看我們一般情況下方法的調用。類似這樣的通用方法你一定寫過:
或者在項目中有一個類似Utils的工具類,裡面有多個Helper,例如StringHelper、XmlHelper等等,每個Helper裡面有多個static的通用方法,然後調用的時候就是StringHelper.GetNotNullStr("aa");這樣。還有一種普通的用法就是new 一個對象,通過對象去調用類裡面的非static方法。反正部落客剛開始做項目的時候就是這樣寫的。後來随着工作經驗的累積,部落客看到了擴充方法的寫法,立馬就感覺自己原來的寫法太Low了。進入正題。
1、.Net内置對象的擴充方法
.Net内部也有很多定義的擴充方法,例如我們Linq常用的Where(x=>x==true)、Select()等等。當你轉到定義的時候你很容易看出來:public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)。當然我們也可以給.Net對象新增擴充方法,比如我們要給string對象加一個擴充方法(注意這個方法不能和調用的Main方法放在同一個類中):
然後在Main方法裡面調用:
簡單介紹:public static string GetNotNullStr(this string strRes)其中this string就表示給string對象添加擴充方法。那麼在同一個命名空間下面定義的所有的string類型的變量都可以.GetNotNullStr()這樣直接調用。strTest.GetNotNullStr();為什麼這樣調用不用傳參數,是因為strTest就是作為參數傳入到方法裡面的。你可以試試。使用起來就和.Net framework定義的方法一樣:
當然除了string,你可以給.Net内置的其他對象加擴充方法,例如給DataGridViewRow的擴充方法:
View Code
這樣看上去就像在擴充.Net Framework。有沒有感覺有點高大上~
2、一般對象的擴充方法
和Framework内置對象一樣,自定義的對象也可以增加擴充方法。直接上示例代碼:
Main方法裡面調用:
和string擴充方法類似,就不多做解釋了。
3、泛型對象的擴充方法
除了上面兩種之外,部落客發現其實可以定義一個泛型的擴充方法。那麼,是不是所有的類型都可以直接使用這個擴充方法了呢?為了保持程式的嚴謹,下面的方法可能沒有實際意義,當開發中部落客覺得可能存在這種場景:
使用擴充方法有幾個值得注意的地方:
(1)擴充方法不能和調用的方法放到同一個類中
(2)第一個參數必須要,并且必須是this,這是擴充方法的辨別。如果方法裡面還要傳入其他參數,可以在後面追加參數
(3)擴充方法所在的類必須是靜态類
(4)最好保證擴充方法和調用方法在同一個命名空間下
可能你第一次使用這個會覺得很别扭。你也許會說擴充方法和我以前用的static方法無論從代碼實作還是算法效率都差不多嘛,是的!确實差不多,但使用多了之後會發現它确實能幫你省去很多代碼。
本文轉自懶得安分部落格園部落格,原文連結:http://www.cnblogs.com/landeanfen/p/4632467.html,如需轉載請自行聯系原作者