C# MulticastDelegate and Invoke Method

本文关键字:Method Invoke and MulticastDelegate | 更新日期: 2023-09-27 18:12:45

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

C# MulticastDelegate and Invoke Method

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方法在反射中很有用。