我在考虑 MulticastDelegate 和 Delegate,我不明白为什么调用方法不是 MulticastDelegate 的抽象方法。有人知道吗?
1 回答
该MulticastDelegate
类型没有Invoke()
方法(也没有BeginInvoke()
)。这些方法delegate
由运行时以实际类型自动提供。所以“为什么没有标记Invoke()
方法”这个问题的最明显原因是没有这样的方法。MulticlassDelegate
abstract
如果您问为什么该方法不在MulticlassDelegate
(然后标记abstract
在那里),那么我会问您:怎么可能?每个委托类型都需要自己的Invoke()
方法,因为该方法的签名具体取决于委托类型的签名。没有基类可以提供这种类型。
最后,请注意,该MulticlassDelegate
类型是 .NET 中的几种“特殊”类型之一,并且明确不打算由用户代码继承。不是它,也不是该类型的任何声明delegate
的子类。abstract
由于继承是不可能的,所以成员是否是;并不重要。即使它对任何人都没有好处。
从文档中:
Delegate 类是委托类型的基类。但是,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。也不允许从委托类型派生新类型。Delegate 类不被视为委托类型;它是一个用于派生委托类型的类。
大多数语言都实现了委托关键字,并且这些语言的编译器能够派生自 MulticastDelegate 类;因此,用户应该使用语言提供的delegate关键字。
- 注意:
公共语言运行时为每个委托类型提供了一个 Invoke 方法,其签名与委托相同。您不必从 C#、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器会自动调用它。当您想要查找委托类型的签名时,Invoke 方法在反射中很有用。