【问题标题】:Why use "new DelegateType(Delegate)"?为什么要使用“new DelegateType(Delegate)”?
【发布时间】:2011-12-05 19:35:19
【问题描述】:

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

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");

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

【问题讨论】:

标签: c# delegates


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    不过,在大多数情况下,命名方法组更容易、更清晰。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-12
            • 1970-01-01
            • 2019-10-09
            • 1970-01-01
            • 2011-11-03
            • 2012-04-15
            • 2023-03-30
            • 1970-01-01
            相关资源
            最近更新 更多