C#擴(kuò)展方法學(xué)習(xí)經(jīng)驗(yàn)
C#新語言特性有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#擴(kuò)展方法,包括介紹通過using namespace來導(dǎo)入其它命名空間中的擴(kuò)展方法等方面。
C#擴(kuò)展方法(Extension Methods)
往往我們需要對(duì)CLR類型進(jìn)行一些操作,但苦于無法擴(kuò)展CLR類型的方法,只能創(chuàng)建一些helper方法,或者繼承類。我們來修改上面的User類:
- public class User
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public int Age { get; set; }
- public string Read()
- {
- return "Id:" + Id + "姓名:" + Name + "年齡:" + Age;
- }
- }
然后調(diào)用
- var user = new { Id = 1, Name = "YJingLee", Age = 22 };
- var str = user.Read();
現(xiàn)在有了擴(kuò)展方法就方便多了。
擴(kuò)展方法允許開發(fā)人員往一個(gè)現(xiàn)有的CLR類型的公開契約(contract)中添加新的方法,而不用生成子類或者重新編譯原來的類型。擴(kuò)展方法有助于把今天動(dòng)態(tài)語言中流行的對(duì)duck typing的支持之靈活性,與強(qiáng)類型語言之性能和編譯時(shí)驗(yàn)證融合起來?!肧cott博文
擴(kuò)展方法是可以通過使用實(shí)例方法語法調(diào)用的靜態(tài)方法。效果上,使得附加的方法擴(kuò)展已存在類型和構(gòu)造類型成為可能。他可以對(duì)現(xiàn)有類功能進(jìn)行擴(kuò)充,從而使該類型的實(shí)例具有更多的方法(功能)。
擴(kuò)展方法允許我們在不改變源代碼的情況下擴(kuò)展(即添加不能修改)現(xiàn)有類型中的實(shí)例方法。
擴(kuò)展方法給我們一個(gè)怎樣的思路呢?我們一步一步做一下!
首先聲明擴(kuò)展方法:通過指定關(guān)鍵字this修飾方法的第一個(gè)參數(shù)。注意擴(kuò)展方法僅可聲明在靜態(tài)類中。擴(kuò)展方法具備所有常規(guī)靜態(tài)方法的所有能力,可以使用實(shí)例方法語法來調(diào)用。接著就可以調(diào)用擴(kuò)展方法了。下面通過一個(gè)具體的實(shí)例分析一下:
例如我們要檢查一個(gè)字符串變量是否是合法的電子郵件地址?在.Net2.0框架下像這樣:
- var email = "leeyongjing@gmail.com";
- if (EmailValidator.IsValid(email))
- {
- Response.Write("YJingLee提示:這是一個(gè)正確的郵件地址");
- }
而使用C#擴(kuò)展方法的話,我可以添加“IsValidEmailAddress()”方法到string類本身中去,該方法返回當(dāng)前字符串實(shí)例是否是個(gè)合法的字符串。
- if (email.IsValidEmailAddress())
- {
- Response.Write("YJingLee提示:這是一個(gè)正確的郵件地址");
- }
我們是怎么把這個(gè)IsValidEmailAddress()方法添加到現(xiàn)有的string類里去的呢?先定義一個(gè)靜態(tài)類,再定義“IsValidEmailAddress”這個(gè)靜態(tài)的法來實(shí)現(xiàn)的。
- public static class Extensions//靜態(tài)類
- {
- public static bool IsValidEmailAddress(this string s)
- //靜態(tài)方法和this
- {
- Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
- return regex.IsMatch(s);
- }
- }
注意,上面的靜態(tài)方法在第一個(gè)類型是string的參數(shù)變量前有個(gè)“this”關(guān)鍵詞,這告訴編譯器,這個(gè)特定的擴(kuò)展方法應(yīng)該添加到類型為“string”的對(duì)象中去。然后在IsValidEmailAddress()方法實(shí)現(xiàn)里,我可以訪問調(diào)用該方法的實(shí)際string實(shí)例的所有公開屬性/方法/事件,取決于它是否是合法電子郵件地址來返回true/false。
C#擴(kuò)展方法不僅能夠應(yīng)用到個(gè)別類型上,也能應(yīng)用到.NET框架中任何基類或接口上。即可用于整個(gè).NET框架豐富的可組合的框架層擴(kuò)展。
擴(kuò)展方法要點(diǎn)
1. 擴(kuò)展方法的本質(zhì)為將實(shí)例方法調(diào)用在編譯期改變?yōu)殪o態(tài)類中的靜態(tài)方法調(diào)用。事實(shí)上,它確實(shí)擁有靜態(tài)方法所具有的所有功能。
2. 擴(kuò)展方法的作用域是整個(gè)namespace可見的,并且可以通過using namespace來導(dǎo)入其它命名空間中的擴(kuò)展方法。
3. 擴(kuò)展方法的優(yōu)先級(jí):現(xiàn)有實(shí)例方法優(yōu)先級(jí)最高,其次為最近的namespace下的靜態(tài)類的靜態(tài)方法,最后為較遠(yuǎn)的namespace下的靜態(tài)類的靜態(tài)方法。
4. 擴(kuò)展方法是一種編譯時(shí)技術(shù),注意與反射等運(yùn)行時(shí)技術(shù)進(jìn)行區(qū)別,并慎重使用。
【編輯推薦】