**:
擴充套件方法使你能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。 擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。這是msdn的描述。上面幾句我看好多部落格都是這樣開頭的。所以我也這樣開頭。
一、為什麼要有擴充套件方法?
開頭也說了,無需建立新的派生型別、重新編譯或其他方式修改原始型別給現有類或介面新增方法。比如在沒有擴充套件之前,會經常有一些helper工具類,例如處理字串、時間的。有了擴充套件我們可以直接擴充套件字串類或時間類就可以了,這樣不用在例項化helper類就能直接處理。
二、擴充套件方法有什麼特徵?
擴充套件方法是靜態方法,是類的一部分,但是實際上沒有放在類的源**中。
擴充套件方法所在的類也必須被宣告為static
c#只支援擴充套件方法,不支援擴充套件屬性、擴充套件事件等。
擴充套件方法的第乙個引數是要擴充套件的型別,放在this關鍵字的後面,this後面的引數不屬於方法的引數
在擴充套件方法中,可以訪問擴充套件型別的所有公共方法和屬性。
擴充套件方法擴充套件自哪個型別,就必須是此型別的變數來使用,其他型別無法使用
如果擴充套件方法和例項方法具有相同的簽名,則優先呼叫例項方法
擴充套件自父類上的方法,可以被子類的物件直接使用
擴充套件自介面上的方法,可以被實現類的物件直接使用
擴充套件方法最終還是被編譯器編譯成:靜態類.靜態方法()
三、demo
上面幾句基本總結把擴充套件總結完了,下面做乙個demo來說明一下。
1.定義ianimal介面 宣告void eat();方法
using system;2.定義person類實現介面ianimal實現void eat();方法using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace extensionmethod
}
using system;3.定義擴充套件方法extensionmethodusing system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace extensionmethod}}
using system;上面在extensionmethod類中定義了4個擴充套件方法,兩個是對介面ianimal的擴充套件,兩個是對person類的擴充套件。using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace extensionmethod
public static void sleep(this ianimal ianimal)
public static void eat(this person person)
public static void sleep(this person person)}}
4.例項化測試
using system;上面mian方法中,首先例項化了乙個person物件,賦值給ianimal型別的變數,呼叫eat()和sleep()方法。然後又例項化了乙個person物件,這次賦值給person型別的變數。using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace extensionmethod}}
下面來看下執行結果是不是出乎意料:
p和p1我們可以對比著來分析,對於eat()方法都是輸出」person eat」,如果擴充套件方法和例項方法具有相同的簽名,則優先呼叫例項方法,這句話正好能解釋為什麼。但是對於sleep()方法,我們可以看到使用ianimal型別的變數呼叫的是介面的擴充套件方法,使用person型別的變數呼叫的是person型別的擴充套件方法。擴充套件方法擴充套件自哪個型別,就必須是此型別的變數來使用,其他型別無法使用,與這句雖然有點出入,但也是蠻符合的。我是這樣理解的:對於同名方法,例項方法優先擴充套件方法,自身擴充套件方法優先父類方法。 也可能是因為子類覆蓋了父類的擴充套件方法。
我們可以把person對的擴充套件方法注釋,然後看下執行結果。
從上面的結果可以看到,擴充套件自介面上的方法,可以被實現類的物件直接使用,其實擴充套件自父類上的方法,可以被子類的物件直接使用和介面類似。
C 語法之擴充套件
擴充套件方法使你能夠向現有型別 新增 方法,而無需建立新的派生型別 重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。這是msdn的描述。上面幾句我看好多部落格都是這樣開頭的。所以我也這樣開頭。一 為什麼要有擴充套件方法?開頭也說了,無...
C 之專案常用方法之靜態擴充套件
一般專案中我們經常用到資料json的序列化與反序列化,為了方便在需要的地方快速使用,一般建議都封裝為靜態擴充套件方法,在需要的地方可直接使用。ps 若要新增此擴充套件方法,必須得在nuget包中新增 newtonsoft.json 的引用。using system using system.coll...
C 擴充套件方法
c 語言從3.0開始增加了乙個很特別的功能 擴充套件方法。那麼擴充套件方法起什麼作用呢?很多時候我們想為已經存在的類擴充套件某些功能,而又沒有必要去繼承該類,甚至有時候這個類根本就不允許繼承,如string類,這時候就可以使用擴充套件方法來為其擴充套件功能。下面舉例說明 一 我們建立乙個類庫如下 c...