10

我有一个简单的问题:实例化 C# 委托与仅传递函数引用相比有什么优势?我的意思是:

为什么:

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

什么时候可以做:

Thread t = new Thread(SomeObject.SomeMethod);

根据我的经验,两者都可以编译和工作......我错过了什么吗?

4

3 回答 3

6

只要方法组SomeObject.SomeMethod具有返回类型void且不带参数的方法,就没有区别。这是因为ThreadStart定义为 adelegate不返回void且不接受参数,因此存在从方法组SomeObject.SomeMethod到的隐式转换ThreadStart。因此,两者都在调用构造函数的Thread(ThreadStart)重载Thread

语言规范的相关部分是§6.6(方法组转换)。

我有一个简单的问题:实例化 C# 委托与仅传递函数引用相比有什么优势?

所以,这里只是对术语的更正。和

class MyObject {
    public void SomeMethod() { }
}

MyObject someObject = new MyObject();

表示的someObject.SomeMethod是一个方法组。您可以将其视为可以使用符号查找的一组重载方法someObject.SomeMethod

于 2010-02-02T01:17:10.447 回答
4

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

于 2010-02-02T07:00:20.803 回答
0

那是等价的。关于该主题的很好的介绍性文章:C# 委托、匿名方法和 Lambda 表达式 - 我的天!

于 2010-02-02T01:17:19.353 回答