天天看點

C# 參數帶this是什麼意思(擴充方法)

擴充方法使你能夠向現有類型“添加”方法,而無需建立新的派生類型、重新編譯或以其他方式修改原始類型。 擴充方法是一種特殊的靜态方法,但可以像擴充類型上的執行個體方法一樣進行調用。 對于用 c# 和 visual basic 編寫的用戶端代碼,調用擴充方法與調用在類型中實際定義的方法之間沒有明顯的差異。

intellisense 語句完成中看到這些附加方法。

<a target="_blank">c#</a>

可使用此 using 指令将 wordcount 擴充方法置于範圍中:

而且,可以使用以下文法從應用程式中調用該擴充方法:

在代碼中,可以使用執行個體方法文法調用該擴充方法。 但是,編譯器生成的中間語言 (il) 會将代碼轉換為對靜态方法的調用。 是以,并未真正違反封裝原則。 實際上,擴充方法無法通路它們所擴充的類型中的私有變量。

通常,你更多時候是調用擴充方法而不是實作你自己的擴充方法。 由于擴充方法是使用執行個體方法文法調用的,是以不需要任何特殊知識即可從用戶端代碼中使用它們。 若要為特定類型啟用擴充方法,隻需為在其中定義這些方法的命名空間添加 using 指令。 例如,若要使用标準查詢運算符,請将此 using 指令添加到代碼中:

intellisense 中。

C# 參數帶this是什麼意思(擴充方法)

說明

<a target="_blank">在編譯時綁定擴充方法</a>

<a target="_blank"></a>

可以使用擴充方法來擴充類或接口,但不能重寫擴充方法。 與接口或類方法具有相同名稱和簽名的擴充方法永遠不會被調用。 編譯時,擴充方法的優先級總是比類型本身中定義的執行個體方法低。 換句話說,如果某個類型具有一個名為 process(int

i) 的方法,而你有一個具有相同簽名的擴充方法,則編譯器總是綁定到該執行個體方法。 當編譯器遇到方法調用時,它首先在該類型的執行個體方法中尋找比對的方法。 如果未找到任何比對方法,編譯器将搜尋為該類型定義的任何擴充方法,并且綁定到它找到的第一個擴充方法。 下面的示例示範編譯器如何确定要綁定到哪個擴充方法或執行個體方法。

<a target="_blank">示例</a>

下面的示例示範 c# 編譯器在确定是将方法調用綁定到類型上的執行個體方法還是綁定到擴充方法時所遵循的規則。 靜态類 extensions 包含為任何實作了 imyinterface 的類型定義的擴充方法。 類 a、b 和 c 都實作了該接口。

methodb 擴充方法永遠不會被調用,因為它的名稱和簽名與這些類已經實作的方法完全比對。

如果編譯器找不到具有比對簽名的執行個體方法,它會綁定到比對的擴充方法(如果存在這樣的方法)。

<a target="_blank">通用準則</a>

在使用擴充方法來擴充你無法更改其源代碼的類型時,你需要承受該類型實作中的更改會導緻擴充方法失效的風險。

如果你确實為給定類型實作了擴充方法,請記住以下幾點:

如果擴充方法與該類型中定義的方法具有相同的簽名,則擴充方法永遠不會被調用。

在命名空間級别将擴充方法置于範圍中。 例如,如果你在一個名為 extensions 的命名空間中具有多個包含擴充方法的靜态類,則這些擴充方法将全部由 using

extensions; 指令置于範圍中。

繼續閱讀