日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#擴(kuò)展方法詳細(xì)描述

C#語言有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#擴(kuò)展方法,包括介紹好像string類型現(xiàn)在有了GetValueByName這個方法一樣,但實際上string并沒有這樣一個方法等方面。

我們注重客戶提出的每個要求,我們充分考慮每一個細(xì)節(jié),我們積極的做好成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)服務(wù),我們努力開拓更好的視野,通過不懈的努力,成都創(chuàng)新互聯(lián)贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計,小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。

在我們的編程生涯中我們要使用很多很多類庫,這些類庫有的是我們自己開發(fā)的,我們有她的代碼,有的是第三方發(fā)布的,我們不僅沒有他們的代碼,連看的機(jī)會都沒有。

作為.net程序員,我們每天都要和BCL(Base Class Linbrary)打交道。無疑,BCL做為一個年輕的框架類庫,她是成功的,但是還有一些時候我們還是得寫一些”Helper”方法來擴(kuò)展類庫,由于我們不能修改類庫的源代碼,我們只有寫一個個的靜態(tài)類。雖然在使用上也算方便,但作為追求***的程序員來說總有些不雅?,F(xiàn)在我就碰到這樣的事情,前兩天奉命寫一個從XML文件加載Chart圖的設(shè)置的方法,從XML加載數(shù)據(jù)綁定到對象上,這肯定是反射的用武之地了。我經(jīng)常需要寫一些根據(jù)對象屬性名字來判斷這個對象是否有這個屬性或者根據(jù)屬性名獲取該屬性的值。還是按照平常一樣,我很快寫了一個 PropertyHelper,里面有兩個靜態(tài)方法:HasProperty,GetValueByName。

PropertyHelper.HasProperty(point, "X"),如此的調(diào)用也還過得去,不過在C# 3.0微軟為我們提供了C#擴(kuò)展方法?,F(xiàn)在我們可以直接這樣調(diào)用了point.HasProperty(“X”);看看我是如何實現(xiàn)這個C#擴(kuò)展方法的?

 
 
 
  1. public static class PropertyExtension  
  2. {  
  3. public static object GetValueByName(this object self, string propertyName)  
  4. {  
  5. if (self == null)  
  6. {  
  7. return self ;  
  8. }  
  9. Type t = self.GetType();  
  10. PropertyInfo p = t.GetProperty(propertyName);  
  11. return p.GetValue(self, null);  
  12. }  

我給object類型添加了一個C#擴(kuò)展方法,在.net里所有的類都繼承自object,那所有的類都默認(rèn)的擁有這個方法了,真方便,呵呵。

注意到和普通的靜態(tài)方法有何差別?在這個方法的***個參數(shù)前面多了一個this關(guān)鍵字。

C#擴(kuò)展方法:

1 方法所在的類必須是靜態(tài)的

2 方法也必須是靜態(tài)的

3 方法的***個參數(shù)必須是你要擴(kuò)展的那個類型,比如你要給int擴(kuò)展一個方法,那么***個參數(shù)就必須是int。

4 在***個參數(shù)前面還需要有一個this關(guān)鍵字。

按照上面的步驟寫你就得到了一個“C#擴(kuò)展方法”,你可以像調(diào)用這個類的原生方法那樣去調(diào)用它:

 
 
 
  1. string str = "abc";  
  2. object len = str.GetValueByName("Length"); 

好像string類型現(xiàn)在有了GetValueByName這個方法一樣,但實際上string并沒有這樣一個方法。那這又是為什么呢?是我們可愛的編譯器在其中做了手腳。為了避開編譯器的干擾,我們來直接欣賞MSIL代碼:

 
 
 
  1. L_0008: ldstr "Length"  
  2. L_000d: call object TestLambda.PropertyExtension::GetValueByName(object, string) 

下面是對編寫C#擴(kuò)展方法要注意的幾個原則(當(dāng)然,仁者見仁、智者見智,這也是一家之言):

C#擴(kuò)展方法有就近原則,也就是如果在你的程序里有兩個一模一樣的C#擴(kuò)展方法,一個和你的使用類是處于同一命名空間里,另外一個處于別的命名空間里,這個時候會優(yōu)先使用同一命名空間里的C#擴(kuò)展方法,也就是說“血緣關(guān)系”越近,越被青睞。

很多人看到C#擴(kuò)展方法也許眼里冒出金光,以后在設(shè)計的時候不管三七二十一,反正可以擴(kuò)展。還有一些人會對類任意擴(kuò)展,將以前一些作為”Helper”的方法統(tǒng)統(tǒng)使用C#擴(kuò)展方法代替,注意的是C#擴(kuò)展方法有“污染性”,所以我覺得在擴(kuò)展的時候還是想想,是不是值得這樣擴(kuò)展。

在擴(kuò)展的時候也不要對比較高層的類進(jìn)行擴(kuò)展,像我上面對object的擴(kuò)展我覺得就是不可取的,object是所有類的基類,一經(jīng)擴(kuò)展,所有的類都被“污染”了。


文章題目:C#擴(kuò)展方法詳細(xì)描述
鏈接分享:http://m.5511xx.com/article/cdgdjph.html