好的,假设您在某个类中定义了一个委托。
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");
有什么区别?当我只是简单地传递或引用方法委托的签名时,为什么我要实例化并创建一个对象委托。
答案 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");
这样您甚至不需要创建自己的委托。