为什么使用“new DelegateType(Delegate)”?
本文关键字:Delegate DelegateType new 为什么 | 更新日期: 2023-09-27 18:10:56
好,假设你在某个类中定义了一个委托。
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");
有什么区别?当我可以简单地传递或引用方法委托的签名时,为什么我要实例化和创建对象委托呢?
这两个语句之间绝对没有区别。writer = DelegateImplementer.StringWriter;
仍然创建一个delegate
对象;编译器将为您生成new ClassDelegate.StringDelegate ()
。它只是c# 2.0中添加的一个更清晰的语法。
正如@Ben Voigt在他的回答中提到的,只有在编译器无法推断委托类型的c# 2.0中才需要,例如当使用Control.Invoke()时
有时不能推导出正确的类型(比如当你调用泛型时),在这种情况下,你需要让编译器知道你想要哪种类型的委托。
但是,大多数情况下,命名方法组更容易、更清晰。
两者是等价的。后者是c# 2.0的新语法。
两者是相同的,但后一种语法是在c# 2中添加的,以简化委托的使用。
两个方法编译成相同的字节码。
这是语法糖。最终,这两组代码都做同样的事情。
我还注意到。net内置了一堆泛型委托,可以为您节省大量编码。在本例中,我将输入:
Action<string> writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");
这样你甚至不需要创建你自己的委托