C 語法之擴充套件

2021-09-08 19:05:20 字數 3213 閱讀 2387

擴充套件方法使你能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。 擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。這是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 11 擴充套件的friend語法

c 98的friend 參見很久以前的隨筆 友元 c 11擴充套件的friend 直接用 說明,示例如下 1 class poly 2typedef poly p 34 class lilei 5 89class jim 10 1314 class hanmeimei 15 宣告了3個型別 lile...

C 學習之語法

最近學了c 以前在單位用的是c c 由於客戶的程式是c 寫的,所以順便學習了一下。從這次的程式中學到的東西 對物件導向程式設計的概念有了更深入的了解,以前在單位都是api win32程式設計,很少用到物件導向的程式設計,一般都是面向過程程式設計.我記得的幾個關鍵字 1.封裝 封裝就是資料資料的集合,...