C#委托实例化与只传递方法参考

问题描述:

我有一个简单的问题:实例化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

只要方法组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

这是等同的。关于这个主题的好介绍性文章:C# Delegates, Anonymous Methods, and Lambda Expressions – O My!

编译器会推断出,当你键入较短的代码时,你的意思是较长的代码。最终效果没有区别。如果你想要完整的构造函数的清晰度,你可以把它放入;如果你只想要方法组的简洁性,你可以允许编译器推断构造函数。这只是一种文体选择。