C 語法之擴充套件方法

2021-08-17 06:47:11 字數 2900 閱讀 1775

**:

擴充套件方法使你能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。 擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。這是msdn的描述。上面幾句我看好多部落格都是這樣開頭的。所以我也這樣開頭。

一、為什麼要有擴充套件方法?

開頭也說了,無需建立新的派生型別、重新編譯或其他方式修改原始型別給現有類或介面新增方法。比如在沒有擴充套件之前,會經常有一些helper工具類,例如處理字串、時間的。有了擴充套件我們可以直接擴充套件字串類或時間類就可以了,這樣不用在例項化helper類就能直接處理。

二、擴充套件方法有什麼特徵?

擴充套件方法是靜態方法,是類的一部分,但是實際上沒有放在類的源**中。

擴充套件方法所在的類也必須被宣告為static

c#只支援擴充套件方法,不支援擴充套件屬性、擴充套件事件等。

擴充套件方法的第乙個引數是要擴充套件的型別,放在this關鍵字的後面,this後面的引數不屬於方法的引數

在擴充套件方法中,可以訪問擴充套件型別的所有公共方法和屬性。

擴充套件方法擴充套件自哪個型別,就必須是此型別的變數來使用,其他型別無法使用

如果擴充套件方法和例項方法具有相同的簽名,則優先呼叫例項方法

擴充套件自父類上的方法,可以被子類的物件直接使用

擴充套件自介面上的方法,可以被實現類的物件直接使用

擴充套件方法最終還是被編譯器編譯成:靜態類.靜態方法()

三、demo

上面幾句基本總結把擴充套件總結完了,下面做乙個demo來說明一下。

1.定義ianimal介面 宣告void eat();方法

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace extensionmethod

}

2.定義person類實現介面ianimal實現void eat();方法

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace extensionmethod}}

3.定義擴充套件方法extensionmethod

using system;

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)}}

上面在extensionmethod類中定義了4個擴充套件方法,兩個是對介面ianimal的擴充套件,兩個是對person類的擴充套件。

4.例項化測試

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace extensionmethod}}

上面mian方法中,首先例項化了乙個person物件,賦值給ianimal型別的變數,呼叫eat()和sleep()方法。然後又例項化了乙個person物件,這次賦值給person型別的變數。

下面來看下執行結果是不是出乎意料:

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...