C#MulticastDelegate和Invoke方法

时间:2015-09-13 23:14:47

标签: c# multicastdelegate

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

1 个答案:

答案 0 :(得分:1)

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

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

最后,请注意MulticlassDelegate类型是其中之一"特殊" .NET中的类型,明确意图由用户代码继承。不是它,也不是该类型的任何声明的delegate子类。由于继承是不可能的,因此成员是abstract是否真的无关紧要;即使它是,也不会对任何人有任何好处。

来自the documentation

  

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

     

大多数语言都实现了一个委托关键字,这些语言的编译器可以从MulticastDelegate类派生出来;因此,用户应使用该语言提供的委托关键字。

     
      
  • 注意:

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