为什么使用“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");

有什么区别?当我可以简单地传递或引用方法委托的签名时,为什么我要实例化和创建对象委托呢?

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

这两个语句之间绝对没有区别。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");

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