C#委托实例化与只传递方法参考
我有一个简单的问题:实例化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
编译器会推断出,当你键入较短的代码时,你的意思是较长的代码。最终效果没有区别。如果你想要完整的构造函数的清晰度,你可以把它放入;如果你只想要方法组的简洁性,你可以允许编译器推断构造函数。这只是一种文体选择。
[新的Action()和lambda之间的区别是什么?](http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal 2014-07-06 20:12:39