我有一個簡單的問題:實例化C#委託與僅傳遞函數引用相比,有什麼優勢?我的意思是:C#委託實例化與只傳遞方法參考
爲什麼:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
當你可以這樣做:
Thread t = new Thread(SomeObject.SomeMethod);
雙方將編譯並在我的經驗,工作......我失去了什麼?
我有一個簡單的問題:實例化C#委託與僅傳遞函數引用相比,有什麼優勢?我的意思是:C#委託實例化與只傳遞方法參考
爲什麼:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
當你可以這樣做:
Thread t = new Thread(SomeObject.SomeMethod);
雙方將編譯並在我的經驗,工作......我失去了什麼?
只要方法組SomeObject.SomeMethod
具有返回類型void
並且不帶參數的方法就沒有區別。這是因爲ThreadStart
定義爲delegate
,它返回void
並且不帶參數,因此存在從方法組SomeObject.SomeMethod
到ThreadStart
的隱式轉換。因此,兩者都調用Thread
構造函數的過載Thread(ThreadStart)
。
語言規範的相關部分是§6.6(方法組轉換)。
我有一個簡單的問題:實例化C#委託與單純傳遞函數引用相比,有什麼優勢?
所以,這裏只是對術語的修正。 With
class MyObject {
public void SomeMethod() { }
}
MyObject someObject = new MyObject();
someObject.SomeMethod
表示的東西是方法組。您可以將其想象爲一組重載方法可以使用符號someObject.SomeMethod
查找。
'someObject.SomeMethod()'也是一個方法組嗎? – 2010-02-02 01:28:42
@John Feminella:不,這將是一個方法調用。 – jason 2010-02-02 01:41:13
嗯,好吧。如果'SomeMethod'有幾個重載的簽名匹配'SomeMethod(...)',其中'...'是任意參數?那麼它是一個方法組嗎?因爲它可以引用幾種方法之一,但尚未解決? – 2010-02-02 01:52:35
這是等同的。關於這個主題的好介紹性文章:C# Delegates, Anonymous Methods, and Lambda Expressions – O My!
編譯器會推斷出,當你鍵入較短的代碼時,你的意思是較長的代碼。最終效果沒有區別。如果你想要完整的構造函數的清晰度,你可以把它放入;如果你只想要方法組的簡潔性,你可以允許編譯器推斷構造函數。這只是一種文體選擇。
[新的Action()和lambda之間的區別是什麼?](http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal 2014-07-06 20:12:39