2013-04-12 90 views
4

我想了解擴展方法是如何工作的嗎?我們可以在非靜態類中定義擴展方法嗎?擴展方法如何工作

*

爲什麼我們把靜態內部類的擴展方法?

*

根據MSDN,

**他們的第一參數指定的方法操作在其上的類型,並且該參數由該改性劑之前。擴展方法 僅在使用using僞指令將名稱空間導入 源代碼時纔在範圍內。

**

什麼是運營商在這裏的作用,它是如何關聯的是擴展方法來這樣的說法?

+1

這只是語法... –

+0

另請參見我的答案在這裏:http://stackoverflow.com/questions/3045242/this-in-function-parameter/3045313#3045313 –

回答

6

不,你不能在一個非靜態的類上定義擴展方法。

this是語法糖,它允許在實例上調用您的靜態擴展方法。但在一天結束時,擴展方法不過是靜態類中的靜態方法。

所以基本上:

var test = myInstance.MyExtensionMethod(); 

相同

var test = MyExtensionClass.MyExtensionMethod(myInstance); 
2

他們是4所要求的方法是一個擴展方法:

  • 它在靜態聲明
  • 它必須是靜態的(這實際上永遠是真的我F中的第一個是滿足)
  • 它必須是公共
  • 它已經打上this關鍵字

第一個參數所以你不能在非靜態類中定義擴展方法。

整個擴展方法的功能是某種語法糖。下面的擴展方法上MyClass聲明:

// The following extension methods can be accessed by instances of any 
// class that is or inherits MyClass. 
public static class Extension 
{ 
    public static void MethodA(this MyClass myInterface, int i) 
    { 
     Console.WriteLine 
      ("Extension.MethodA(this IMyInterface myInterface, int i)"); 
    } 
} 

可以通過兩種方式來調用:

var myClassObject = new MyClass(); 

Extension.MethodA(myClassObject); 

或者

myClassObject.MethodA(); 

然而,第二個將被改造成由編譯器的第一個無論如何。

1

不,擴展方法必須在靜態類中,這只是規則。本來可以允許在任何地方定義擴展方法,但是爲了更容易找到它們,它們不能被埋在類中,並且有很多其他代碼。

this關鍵字用於擴展方法的第一個參數以指定它是擴展方法。

(內部實現一個普通的方法也具有對對象的引用作爲第一個參數,那麼什麼編譯器與擴展方法只是將它們添加到類中的其他方法。)

2

什麼是作用在這裏這運營商,它是如何關聯的是 擴展方法來這樣的說法?

在這方面this是不是一個操作符,它是一種改性劑。它可能被稱爲別的東西,它與this對象沒有任何關係,它指的是在普通方法調用中的當前對象。

this改性劑的作用是告訴編譯器,這實際上是一個擴展方法,而不是標準的靜態方法,所以它不會抱怨,當你調用它的方式,其看起來就像一個實例方法調用,但事實並非如此。