一、基本概念
1. 定義:
擴充套件方法被定義為靜態方法,但它們是通過例項方法的語法進行呼叫的。它們的第乙個引數指定該方法作用於哪個型別,並且該引數以this修飾符作為字首。擴充套件方法當然不能破壞物件導向封裝的概念,所以只能是訪問所擴充套件類的public成員。
2. 作用:
擴充套件方法能夠向現有型別(存在的類)「新增」方法,而無需建立新的派生型別、重新編譯或其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。
3.通俗理解:
一般來說,int資料型別有個tostring的方法,就是把int資料轉換為字串的型別,比如現在我們想在轉換成字串的時候還新增一點東西,比如增加乙個字元a,那麼之前的tostring就不好使了,因為他只是我們的int資料轉換為string型別的,卻並不能新增乙個字母a,所以這就要用到所謂的擴充套件方法了。
比如,我給現有的型別增加乙個擴充套件方法。我們想給string型別增加乙個add方法,該方法的作用是給字串增加乙個字母a。
**如下:
//必須是靜態類才可以新增擴充套件方法
staticclassprogram
//宣告擴充套件方法
//擴充套件方法必須是靜態的,add有三個引數
//this 必須有,string表示我要擴充套件的型別,stringname表示物件名
//三個引數this和擴充套件的型別必不可少,物件名可以自己隨意取如果需要傳遞引數,//再增加乙個變數即可
publicstaticstringadd(thisstringstringname) }
4. 總結
在程式設計中,我們要使用很多很多的類庫,這些類庫有的是我們自己開發的,有的是別人的**,有的是第三方發布的,我們不僅沒有他們的**,連看的機會都沒有。然而作為.net
程式設計師,我們每天都要和bcl(base class linbrary)打交道。無疑,bcl做為乙個年輕的框架類庫,她是成功的,但是還有一些時候我們還是得寫一些「helper」方法來擴充套件類庫,由於我們不能修改類庫的源**,我們只有寫乙個個的靜態類。
二、擴充套件方法的優缺點
1. 優點:
使用擴充套件方法明顯比使用傳統方法要簡單,不需要例項化,修改方法也不需要重新修改和編譯。
2. 缺點:
1).是靜態方法,使用不當會造成「汙染」。
2).不具有override的能力,不會過載原有的方法。
3).擴充套件方法會被擴充套件類的同名方法覆蓋,所以實現擴充套件方法我們需要承擔隨時被覆蓋的風險。
4).擴充套件方法不能訪問被擴充套件類的私有成員。
5).擴充套件方法只能用例項來呼叫,不能像普通的靜態方法一樣使用類名呼叫;
6).只有引入擴充套件方法坐在的命名空間後,擴充套件方法才可以使用。
三、 擴充套件方法的本質
1. 將例項方法呼叫在編譯期改變為靜態類中的靜態方法呼叫,實際上擴充套件方法確實擁有靜態方法所具有的所有功能。
2. 作用域是整個namespace可見的,並通過使用using namespace來匯入其他命名空間中的擴充套件方法
3. 優先順序:現有例項方法的優先順序最高,其次為最近的namespace下的靜態類的靜態方法,最後為較為遠的namespace下的靜態類的靜態方法。
4. 是一種編譯技術,注意與反射等執行時技術進行區別,慎重使用!
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...
C 擴充套件方法
使用 net 3.0之後,我一直都覺得有種方法很奇怪,這種方法在一般的方法前面多了乙個藍色的向下箭頭。這種方法其實是擴充套件方法,這種擴充套件方法不需要去修改原類。class program public static class extendfunction 例子中我定義了乙個擴充套件方法,這個方...