簡體   English   中英

在C#中靜態方法的形式參數中使用“ this”關鍵字

[英]Use of “this” keyword in formal parameters for static methods in C#

我遇到了如下幾個C#代碼實例:

public static int Foo(this MyClass arg)

在這種情況下,我無法找到this關鍵字的含義的解釋。 有什么見解嗎?

這是一種擴展方法 請參閱此處以獲取解釋

擴展方法使開發人員可以向現有CLR類型的公共合同添加新方法,而不必對其進行子類化或重新編譯原始類型。 擴展方法有助於將當今在動態語言中流行的“鴨子鍵入”支持的靈活性與強類型語言的性能和編譯時驗證相結合。

擴展方法可實現各種有用的方案,並有助於實現真正強大的LINQ查詢框架...。

這意味着你可以打電話

MyClass myClass = new MyClass();
int i = myClass.Foo();

而不是

MyClass myClass = new MyClass();
int i = Foo(myClass);

這樣可以構建如下所述的流暢接口

Scott Gu引用的博客文章對此進行了很好解釋。

對我來說,該問題的答案在該帖子的以下聲明中:

請注意,上面的靜態方法如何在字符串類型的第一個參數實參之前具有“ this”關鍵字。 這告訴編譯器應將此特殊擴展方法添加到“字符串”類型的對象中。 然后,在IsValidEmailAddress()方法實現中,我可以訪問調用該方法的實際字符串實例的所有公共屬性/方法/事件,並根據是否為有效電子郵件返回true / false。

除了Preet Sangha的解釋之外:
Intellisense用藍色箭頭(例如,在“ Aggregate <>”前面)顯示擴展方法:

在此處輸入圖片說明

你需要一個

using the.namespace.of.the.static.class.with.the.extension.methods;

如果擴展方法與使用它們的代碼位於不同的名稱空間中,則擴展方法將顯示並可用。

它們是擴展方法 歡迎來到一個全新的流利世界 :)

前幾天我才剛剛學到這一點:this關鍵字定義了該方法是對該方法進行擴展的類的擴展。 因此,對於您的示例,MyClass將具有一個稱為Foo的新擴展方法(該擴展方法不接受任何參數並返回int;可以與任何其他公共方法一樣使用)。

“ this”擴展了參數列表中的下一個類

因此在“ this”下面的方法簽名中擴展了“ String”。 將行作為方法的常規參數傳遞給函數。 公共靜態字符串[] SplitCsvLine(此字符串行)

在上面的示例中,“ this”類擴展了內置的“ String”類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM