亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#特性 擴展方法

 更新時間:2014年12月25日 14:55:23   投稿:mdxy-dxy  
在我們的編程生涯中我們要使用很多很多類庫,這些類庫有的是我們自己開發(fā)的,我們有她的代碼,有的是第三方發(fā)布的,我們不僅沒有他們的代碼,連看的機會都沒有

作為.net程序員,我們每天都要和BCL(Base Class Linbrary)打交道。無疑,BCL做為一個年輕的框架類庫,她是成功的,但是還有一些時候我們還是得寫一些”Helper”方法來擴展類庫,由于我們不能修改類庫的源代碼,我們只有寫一個個的靜態(tài)類。雖然在使用上也算方便,但作為追求完美的程序員來說總有些不雅。


現(xiàn)在我就碰到這樣的事情,前兩天奉命寫一個從XML文件加載Chart圖的設置的方法,從XML加載數(shù)據(jù)綁定到對象上,這肯定是反射的用武之地了。我經(jīng)常需要寫一些根據(jù)對象屬性名字來判斷這個對象是否有這個屬性或者根據(jù)屬性名獲取該屬性的值。還是按照平常一樣,我很快寫了一個PropertyHelper,里面有兩個靜態(tài)方法:HasProperty,GetValueByName。


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

public static class PropertyExtension
{
    public static object GetValueByName(this object self, string propertyName)
    {
      if (self == null)
      {
        return self ;
      }
      Type t = self.GetType();
      PropertyInfo p = t.GetProperty(propertyName);
      return p.GetValue(self, null);
    }
}

我給object類型添加了一個擴展方法,在.net里所有的類都繼承自object,那所有的類都默認的擁有這個方法了,真方便,呵呵。
注意到和普通的靜態(tài)方法有何差別?在這個方法的第一個參數(shù)前面多了一個this關(guān)鍵字。

擴展方法:

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

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

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

下面將對擴展方法做一些細節(jié)的介紹:
Visual Studio 2008對擴展方法有智能感知的支持,如下圖

在方法的圖標上有一個與其他的都不相同,他的突變下面還帶有一個藍色的向下的箭頭,這就表明這個方法是一個擴展方法。
下面是對編寫擴展方法要注意的幾個原則(當然,仁者見仁、智者見智,這也是一家之言):

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


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


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

發(fā)表與2008-07-16
于2008-08-06第一次更新

相關(guān)文章

  • C#如何將List<string>轉(zhuǎn)換為List<double>

    C#如何將List<string>轉(zhuǎn)換為List<double>

    這篇文章主要介紹了C#如何將List<string>轉(zhuǎn)換為List<double>問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • c# 播放聲音的四種方法

    c# 播放聲音的四種方法

    這篇文章主要介紹了c# 播放聲音的四種方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C#實現(xiàn)裝箱與拆箱操作簡單實例

    C#實現(xiàn)裝箱與拆箱操作簡單實例

    這篇文章主要介紹了C#實現(xiàn)裝箱與拆箱操作,對于新手理解裝箱與拆箱有一定的幫助,需要的朋友可以參考下
    2014-07-07
  • C#中的靜態(tài)字段double.Epsilon實例詳解

    C#中的靜態(tài)字段double.Epsilon實例詳解

    double.Epsilon 是C#中的一個靜態(tài)字段,表示 double 數(shù)據(jù)類型的最小可表示的正數(shù)值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關(guān)知識,需要的朋友可以參考下
    2024-01-01
  • 自定義時間格式轉(zhuǎn)換代碼分享

    自定義時間格式轉(zhuǎn)換代碼分享

    自定義時間格式轉(zhuǎn)換,如"2012年5月14日"的日期字符串,大家參考使用吧
    2013-12-12
  • C#中類成員的定義的修飾關(guān)鍵詞知識點總結(jié)

    C#中類成員的定義的修飾關(guān)鍵詞知識點總結(jié)

    在本篇文章里小編給大家整理了關(guān)于C#中類成員的定義的修飾關(guān)鍵詞知識點內(nèi)容,有需要的朋友們可以參考下。
    2020-02-02
  • C#實現(xiàn)的字符串相似度對比類

    C#實現(xiàn)的字符串相似度對比類

    這篇文章主要介紹了C#實現(xiàn)的字符串相似度對比類,本文直接給出類實現(xiàn)代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-07-07
  • 淺析WPF中Popup彈出層的使用

    淺析WPF中Popup彈出層的使用

    這篇文章將通過一個簡單的小例子,為大家詳細介紹一下如何在WPF開發(fā)中,通過Popup實現(xiàn)鼠標點擊彈出浮動停靠窗口,有需要的小伙伴可以了解下
    2024-01-01
  • C#讀寫INI文件的方法

    C#讀寫INI文件的方法

    這篇文章主要介紹了C#讀寫INI文件的方法,涉及C#讀寫ini文件的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#實現(xiàn)將PDF轉(zhuǎn)為線性化PDF

    C#實現(xiàn)將PDF轉(zhuǎn)為線性化PDF

    線性化PDF文件是PDF文件的一種特殊格式,可以通過Internet更快地進行查看。這篇文章主要介紹了如何通過C#實現(xiàn)將PDF轉(zhuǎn)為線性化PDF,感興趣的小伙伴可以學習一下
    2021-12-12

最新評論