我已經將擴展方法添加到ASP.NET System.Web.UI.Page。 我的應用程序中的每一頁都從這個類繼承。擴展方法 - 必須使用這個關鍵字嗎?
但是,我不能只訪問擴展方法。我必須輸入this.MyMethod();
,而不是隻能使用MyMethod()
。我認爲this
的方法/屬性本質上屬於默認範圍。我不瞭解什麼?或者這是一種擴展方法的細微差別?
我已經將擴展方法添加到ASP.NET System.Web.UI.Page。 我的應用程序中的每一頁都從這個類繼承。擴展方法 - 必須使用這個關鍵字嗎?
但是,我不能只訪問擴展方法。我必須輸入this.MyMethod();
,而不是隻能使用MyMethod()
。我認爲this
的方法/屬性本質上屬於默認範圍。我不瞭解什麼?或者這是一種擴展方法的細微差別?
我以爲 的方法/屬性本身就是默認的 範圍。
他們是。但擴展方法是不是方法this
在默認範圍內;它們是通過編譯器提供的語法糖來訪問的靜態方法。
我相信你已經知道這一點,但我只想澄清:如果ExtensionMethod
是其範圍目前在你的類的擴展方法,鍵入此:
this.ExtensionMethod();
...是一樣的:
SomeStaticClass.ExtensionMethod(this);
this
需要作爲參數到ExtensionMethod
傳遞。上面的第一種方式,編譯器只是爲你做這個。
當然,他們可能已經實現了不同的東西,以便編譯器將「引入」擴展方法以及類成員放入默認範圍;他們只是簡單地選擇不去。我個人喜歡那樣;但我想這是一個主觀的問題。無論如何,如果你不喜歡輸入this
,這只是一個小小的煩惱,對吧?
爲了使用擴展方法,你應該聲明:
using Namespace.Where.Extension.Method.Is.Located
而且不要忘了類,用於保存擴展方法應該是靜態的。
這是一個擴展方法的細微差別嗎?
是的。 (正如其他人所解釋的那樣)。
如果你想使用沒有任何限定的方法,那麼你可以創建一個從Page繼承的類幷包含你的方法(當然不包括第一個參數)。然後讓您的應用程序中的每個頁面都從您的新自定義頁面繼承。
......因爲定義擴展方法的類是靜態的,所以永遠不能擁有它的實例,因此在方法體中它的使用是無效的。 – 2011-04-07 18:56:27
@保羅:我不認爲這是OP的要求。我相信他想知道爲什麼,如果他在'T'類型的代碼中,並且他在'T'上有一個擴展方法,他必須在'T' *代碼中鍵入'this.MyMethod()'*,而不僅僅是'的MyMethod()'。 – 2011-04-07 18:59:28
*再次閱讀這個問題兩次*你是絕對正確的... :)不是說我的評論是錯誤的,無論如何它只是與這個確切的問題無關。 – 2011-04-07 23:44:19