我有一个简单的问题:实例化 C# 委托与仅传递函数引用相比有什么优势?我的意思是:
为什么:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
什么时候可以做:
Thread t = new Thread(SomeObject.SomeMethod);
根据我的经验,两者都可以编译和工作......我错过了什么吗?
我有一个简单的问题:实例化 C# 委托与仅传递函数引用相比有什么优势?我的意思是:
为什么:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
什么时候可以做:
Thread t = new Thread(SomeObject.SomeMethod);
根据我的经验,两者都可以编译和工作......我错过了什么吗?
只要方法组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
。
编译器会推断,当您键入较短的代码时,您的意思是较长的代码。最终效果没有区别。如果你想要完整构造函数的清晰,你可以把它放进去;如果您只想要方法组的简洁性,您可以允许编译器推断构造函数。这只是一种风格选择。
那是等价的。关于该主题的很好的介绍性文章:C# 委托、匿名方法和 Lambda 表达式 - 我的天!