在我們的程式設計生涯中我們要使用很多很多類庫,這些類庫有的是我們自己開發的,我們有她的**,有的是第三方發布的,我們不僅沒有他們的**,連看的機會都沒有。
作為.net程式設計師,我們每天都要和bcl(base class linbrary)打交道。無疑,bcl做為乙個年輕的框架類庫,她是成功的,但是還有一些時候我們還是得寫一些」helper」方法來擴充套件類庫,由於我們不能修改類庫的源**,我們只有寫乙個個的靜態類。雖然在使用上也算方便,但作為追求完美的程式設計師來說總有些**。 現在我就碰到這樣的事情,前兩天奉命寫乙個從xml檔案載入chart圖的設定的方法,從xml載入資料繫結到物件上,這肯定是反射的用武之地了。我經常需要寫一些根據物件屬性名字來判斷這個物件是否有這個屬性或者根據屬性名獲取該屬性的值。還是按照平常一樣,我很快寫了乙個propertyhelper,裡面有兩個靜態方法:hasproperty,getvaluebyname。
propertyhelper.hasproperty(point, "x"),如此的呼叫也還過得去,不過在c# 3.0微軟為我們提供了擴充套件方法。現在我們可以直接這樣呼叫了point.hasproperty(「x」);看看我是如何實現這個擴充套件方法的?
public static class propertyextension
type t = self.gettype();
propertyinfo p = t.getproperty(propertyname);
return p.getvalue(self, null);}}
我給object型別新增了乙個擴充套件方法,在.net裡所有的類都繼承自object,那所有的類都預設的擁有這個方法了,真方便,呵呵。
注意到和普通的靜態方法有何差別?在這個方法的第乙個引數前面多了乙個this關鍵字。
擴充套件方法:
1 方法所在的類必須是靜態的
2 方法也必須是靜態的
3 方法的第乙個引數必須是你要擴充套件的那個型別,比如你要給int擴充套件乙個方法,那麼第乙個引數就必須是int。
4 在第乙個引數前面還需要有乙個this關鍵字。
按照上面的步驟寫你就得到了乙個「擴充套件方法」,你可以像呼叫這個類的原生方法那樣去呼叫它:
string str = "abc";
object len = str.getvaluebyname("length");
好像string型別現在有了getvaluebyname這個方法一樣,但實際上string並沒有這樣乙個方法。那這又是為什麼呢?是我們可愛的編譯器在其中做了手腳。為了避開編譯器的干擾,我們來直接欣賞msil**:
l_0008: ldstr "length"
l_000d: call object testlambda.propertyextension::getvaluebyname(object, string)
從msil中我們可以看出,這段**編譯後和呼叫靜態方法沒有任何的差別(從call指令來看,這是在呼叫乙個靜態方法)。
從這裡可以知道擴充套件方法即可以使用例項呼叫的方式也可以直接使用靜態類呼叫的方式:
str.getvaluebyname("length");
propertyextension.getvaluebyname(str,"length");
下面將對擴充套件方法做一些細節的介紹:
visual studio 2008對擴充套件方法有智慧型感知的支援,如下圖:
在方法的圖示上有乙個與其他的都不相同,他的突變下面還帶有乙個藍色的向下的箭頭,這就表明這個方法是乙個擴充套件方法。
下面是對編寫擴充套件方法要注意的幾個原則(當然,仁者見仁、智者見智,這也是一家之言):
擴充套件方法有就近原則,也就是如果在你的程式裡有兩個一模一樣的擴充套件方法,乙個和你的使用類是處於同一命名空間裡,另外乙個處於別的命名空間裡,這個時候會優先使用同一命名空間裡的擴充套件方法,也就是說「血緣關係」越近,越被青睞。
很多人看到擴充套件方法也許眼裡冒出金光,以後在設計的時候不管三七二十一,反正可以擴充套件。還有一些人會對類任意擴充套件,將以前一些作為」helper」的方法統統使用擴充套件方法代替,注意的是擴充套件方法有「汙染性」,所以我覺得在擴充套件的時候還是想想,是不是值得這樣擴充套件。
在擴充套件的時候也不要對比較高層的類進行擴充套件,像我上面對object的擴充套件我覺得就是不可取的,object是所有類的基類,一經擴充套件,所有的類都被「汙染」了。
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
使用 net 3.0之後,我一直都覺得有種方法很奇怪,這種方法在一般的方法前面多了乙個藍色的向下箭頭。這種方法其實是擴充套件方法,這種擴充套件方法不需要去修改原類。class program public static class extendfunction 例子中我定義了乙個擴充套件方法,這個方...