1

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

4

1 回答 1

2

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

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

最后,请注意,该MulticlassDelegate类型是 .NET 中的几种“特殊”类型之一,并且明确打算由用户代码继承。不是它,也不是该类型的任何声明delegate的子类。abstract由于继承是不可能的,所以成员是否是;并不重要。即使它对任何人都没有好处。

文档中

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

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

  • 注意:

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