我有一个简单的问题:实例化C#委托与仅传递函数引用相比有什么好处?我的意思是:
为什么:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
当你能做到:
Thread t = new Thread(SomeObject.SomeMethod);
两者都会根据我的经验编译和工作......我错过了什么吗?
答案 0 :(得分:6)
只要方法组SomeObject.SomeMethod
有一个返回类型为void
且没有参数的方法,就没有区别。这是因为ThreadStart
被定义为返回delegate
并且不带参数的void
,因此存在从方法组SomeObject.SomeMethod
到ThreadStart
的隐式转换。因此,两者都在调用Thread
构造函数的重载Thread(ThreadStart)
。
语言规范的相关部分是§6.6(方法组转换)。
我有一个简单的问题:实例化C#委托与仅传递函数引用相比有什么好处?
所以,这里只是修改术语。与
class MyObject {
public void SomeMethod() { }
}
MyObject someObject = new MyObject();
someObject.SomeMethod
表示的是一个方法组。您可以将其视为可以使用符号someObject.SomeMethod
查找重载方法的集合。
答案 1 :(得分:4)
编译器将推断当您键入较短的代码时,您的意思是代码较长。最终效果没有区别。如果你想要完整构造函数的清晰度,你可以把它放进去;如果您只想要方法组的简洁,则可以允许编译器推断构造函数。这只是一种风格选择。
答案 2 :(得分:0)
这相当于。关于这个主题的好的介绍性文章:C# Delegates, Anonymous Methods, and Lambda Expressions – O My!