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