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

时间:2010-02-02 01:10:41

标签: c# .net methods delegates instantiation

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

为什么:

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

当你能做到:

Thread t = new Thread(SomeObject.SomeMethod);

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

3 个答案:

答案 0 :(得分:6)

只要方法组SomeObject.SomeMethod有一个返回类型为void且没有参数的方法,就没有区别。这是因为ThreadStart被定义为返回delegate并且不带参数的void,因此存在从方法组SomeObject.SomeMethodThreadStart的隐式转换。因此,两者都在调用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!