2010-02-02 49 views
9

我有一個簡單的問題:實例化C#委託與僅傳遞函數引用相比,有什麼優勢?我的意思是:C#委託實例化與只傳遞方法參考

爲什麼:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

當你可以這樣做:

Thread t = new Thread(SomeObject.SomeMethod); 

雙方將編譯並在我的經驗,工作......我失去了什麼?

+0

[新的Action()和lambda之間的區別是什麼?](http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal 2014-07-06 20:12:39

回答

6

只要方法組SomeObject.SomeMethod具有返回類型void並且不帶參數的方法就沒有區別。這是因爲ThreadStart定義爲delegate,它返回void並且不帶參數,因此存在從方法組SomeObject.SomeMethodThreadStart的隱式轉換。因此,兩者都調用Thread構造函數的過載Thread(ThreadStart)

語言規範的相關部分是§6.6(方法組轉換)。

我有一個簡單的問題:實例化C#委託與單純傳遞函數引用相比,有什麼優勢?

所以,這裏只是對術語的修正。 With

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

someObject.SomeMethod表示的東西是方法組。您可以將其想象爲一組重載方法可以使用符號someObject.SomeMethod查找。

+1

'someObject.SomeMethod()'也是一個方法組嗎? – 2010-02-02 01:28:42

+1

@John Feminella:不,這將是一個方法調用。 – jason 2010-02-02 01:41:13

+0

嗯,好吧。如果'SomeMethod'有幾個重載的簽名匹配'SomeMethod(...)',其中'...'是任意參數?那麼它是一個方法組嗎?因爲它可以引用幾種方法之一,但尚未解決? – 2010-02-02 01:52:35

4

編譯器會推斷出,當你鍵入較短的代碼時,你的意思是較長的代碼。最終效果沒有區別。如果你想要完整的構造函數的清晰度,你可以把它放入;如果你只想要方法組的簡潔性,你可以允許編譯器推斷構造函數。這只是一種文體選擇。