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

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

public delegate void StringDelegate (string s); 

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

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

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

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

但是,我看到也可以通过这种方式调用委托方法

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

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

这两个陈述之间绝对没有区别。 writer = DelegateImplementer.StringWriter; 仍然创建一个delegate对象; 编译器将为您生成new ClassDelegate.StringDelegate () 。 它只是在C#2.0中添加的更清晰的语法。

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

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

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

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

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

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

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

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

 Action writer; writer = DelegateImplementer.StringWriter; writer ("Hello"); 

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