成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C#擴(kuò)展方法

開發(fā) 后端
本文介紹C#擴(kuò)展方法,在擴(kuò)展的時(shí)候也不要對(duì)比較高層的類進(jìn)行擴(kuò)展,像我上面對(duì)object的擴(kuò)展我覺得就是不可取的,object是所有類的基類,一經(jīng)擴(kuò)展,所有的類都被“污染”了。

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

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

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

  1. publicstaticclassPropertyExtension  
  2. {  
  3. publicstaticobjectGetValueByName(thisobjectself,stringpropertyName)  
  4. {  
  5. if(self==null)  
  6. {  
  7. returnself;  
  8. }  
  9. Typet=self.GetType();  
  10. PropertyInfop=t.GetProperty(propertyName);  
  11. returnp.GetValue(self,null);  
  12. }  

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

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

擴(kuò)展方法:
1.方法所在的類必須是靜態(tài)的
2.方法也必須是靜態(tài)的
3.方法的***個(gè)參數(shù)必須是你要擴(kuò)展的那個(gè)類型,比如你要給int擴(kuò)展一個(gè)方法,那么***個(gè)參數(shù)就必須是int。
4.在***個(gè)參數(shù)前面還需要有一個(gè)this關(guān)鍵字。

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

  1. stringstr="abc";  
  2. objectlen=str.GetValueByName("Length"); 

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

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

從MSIL中我們可以看出,這段代碼編譯后和調(diào)用靜態(tài)方法沒有任何的差別(從call指令來(lái)看,這是在調(diào)用一個(gè)靜態(tài)方法)。

從這里可以知道擴(kuò)展方法即可以使用實(shí)例調(diào)用的方式也可以直接使用靜態(tài)類調(diào)用的方式:

  1. str.GetValueByName("Length");  
  2. PropertyExtension.GetValueByName(str,"Length"); 

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

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

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

【編輯推薦】

  1. 簡(jiǎn)單介紹C#預(yù)處理
  2. 學(xué)習(xí)C#無(wú)詞尾符號(hào)經(jīng)驗(yàn)談
  3. C#調(diào)用QuickTest自動(dòng)化
  4. 詳解C#正規(guī)表達(dá)式
  5. C#字符串插入html標(biāo)簽
責(zé)任編輯:佚名 來(lái)源: 博客園
相關(guān)推薦

2009-08-28 14:25:57

C# byte數(shù)組

2009-09-10 14:52:55

C# get

2009-08-20 16:15:19

C# 匿名方法

2009-09-11 09:15:06

C# get方法

2009-09-03 17:18:40

C#擴(kuò)展性對(duì)象模型

2009-08-27 18:04:01

c#擴(kuò)展方法string

2009-09-10 09:10:17

C# TextBox換

2009-08-17 17:56:32

C# 枚舉

2009-09-01 11:04:59

C#調(diào)用擴(kuò)展方法

2009-08-12 17:27:11

C#讀取文件

2009-08-28 12:19:19

C#靜態(tài)方法

2009-08-28 15:52:23

C#利用sharpzi

2009-09-18 10:58:31

C#數(shù)組操作

2009-09-07 09:36:29

C# DisposeDispose方法

2009-08-20 10:53:23

C#操作內(nèi)存

2009-08-31 14:45:10

C#擴(kuò)展方法

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2009-08-07 17:25:37

C# SortedLi

2009-08-27 09:27:49

C#擴(kuò)展方法

2009-08-18 14:14:45

C#擴(kuò)展方法性能測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美国产日韩在线观看成人 | 中文字幕av在线 | 亚洲精品免费在线 | 亚洲精品欧美精品 | www.欧美.com| 成人高清视频在线观看 | 日韩一级免费看 | 一级黄色播放 | 亚洲国产成人精品女人久久久 | 一区欧美| 999久久久久久久久 国产欧美在线观看 | 久久精品亚洲国产奇米99 | 欧美一二三 | 免费av电影网站 | 久久久www| 懂色av蜜桃av | 精品欧美二区 | 日韩成人av在线 | 久久久久成人精品亚洲国产 | 四虎在线播放 | 狠狠夜夜 | 日韩av一区二区在线观看 | 欧美1—12sexvideos| 日韩精品视频在线 | 精品国产视频 | 亚洲精彩免费视频 | 国产一二区在线 | 91精品国产91久久久久久吃药 | 国产激情偷乱视频一区二区三区 | 一区二区三区小视频 | 国产精品一区久久久 | 成人欧美一区二区三区色青冈 | 麻豆av网站 | 手机看片169| 精品国产一级 | 亚洲精品黄色 | 狠狠狠干| 欧美视频二区 | 国产精品久久久久一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 人妖无码 |