为什么要使用“new DelegateType(Delegate)”?

时间:2011-10-12 04:08:11

标签: c# delegates

好的,假设您在某个类中定义了一个委托。

public delegate void StringDelegate (string s);

另一个类实现了一个方法:

public static void StringWriter (string s) {...}

在我正在阅读“编程C#”第4版的书中,他们使用 new 关键字创建代表,例如:

ClassDelegate.StringDelegate writer;
writer = new ClassDelegate.StringDelegate (DelegateImplementer.StringWriter);
writer("Hello");

但是,我看到一个人也可以这样调用委托方法

ClassDelegate.StringDelegate writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");

有什么区别?当我只是简单地传递或引用方法委托的签名时,为什么我要实例化并创建一个对象委托。

5 个答案:

答案 0 :(得分:5)

这两个陈述完全没有区别。 writer = DelegateImplementer.StringWriter;仍然会创建一个delegate对象;编译器会为您生成new ClassDelegate.StringDelegate ()。它只是一个更清晰的语法added in C# 2.0

正如@Ben Voigt在他的回答中提到的只有在C#2.0中才需要,例如在使用Control.Invoke()时,编译器无法推断出委托的类型。

答案 1 :(得分:4)

有时候无法推断出正确的类型(比如当你调用泛型时),在这种情况下你需要让编译器知道你想要什么样的委托。

但大多数情况下,命名方法组更容易,更清晰。

答案 2 :(得分:4)

这两个是等价的。后者是C#2.0的新语法。

答案 3 :(得分:1)

两者都相同,但在C#2中添加了后一种语法以简化委托使用。

两种方法都编译为相同的字节代码。

答案 4 :(得分:1)

这是语法糖。最终,两组代码都做同样的事情。

我还注意到.Net内置了一堆通用委托,可以为您节省大量编码。在这种情况下,我会这样做:

Action<string> writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");

这样您甚至不需要创建自己的委托。