【问题标题】:C# MulticastDelegate and Invoke MethodC# MulticastDelegate 和调用方法
【发布时间】:2015-12-09 21:38:51
【问题描述】:

我在考虑 MulticastDelegate 和 Delegate,我不明白为什么调用方法不是 MulticastDelegate 的抽象方法。有人知道吗?

【问题讨论】:

  • 为什么你认为它应该是一个抽象方法?
  • 因为所有的委托都实现了相同的调用,所以我可以为我的委托重写调用方法...
  • 不,每个委托的 Invoke() 方法都不同。由编译器从委托声明中自动生成,它具有相同的参数。所以你永远不能说错。它不能是抽象的。

标签: c# multicastdelegate


【解决方案1】:

MulticastDelegate 类型没有Invoke() 方法(也没有BeginInvoke())。这些方法由运行时以实际的delegate 类型自动提供。所以对于“为什么MulticlassDelegate 中的Invoke() 方法没有标记为abstract”这个问题最明显的原因是没有这样的方法

如果您要问为什么该方法不在MulticlassDelegate 中(然后在那里标记为abstract),那么我会问您:怎么可能?每个委托类型都需要自己的Invoke() 方法,因为该方法的签名具体取决于委托类型的签名。没有基类可以提供这种类型。

最后,请注意MulticlassDelegate 类型是 .NET 中的几个“特殊”类型之一,并且明确由用户代码继承。不是它,也不是该类型的任何声明的delegate 子类。由于无法继承,因此成员是否为abstract 并不重要;即使是这样,它也不会对任何人有任何好处。

来自the documentation

Delegate 类是委托类型的基类。但是,只有系统和编译器可以从 Delegate 类或 MulticastDelegate 类显式派生。也不允许从委托类型派生新类型。 Delegate 类不被视为委托类型;它是一个用于派生委托类型的类。

大多数语言都实现了委托关键字,并且这些语言的编译器能够从 MulticastDelegate 类派生;因此,用户应该使用语言提供的delegate关键字。

  • 注意:

    公共语言运行时为每种委托类型提供一个 Invoke 方法,其签名与委托相同。您不必从 C#、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器会自动调用它。当您想要查找委托类型的签名时,Invoke 方法在反射中很有用。

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多