为什么要调用BeginInvoke&内部类被密封时,EndInvoke是虚拟的吗?

时间:2018-02-02 12:10:52

标签: c# delegates

我观察到只要编译器遇到如下的委托声明:

public delegate string StringOperation(string myString);

然后编译器生成以下代码:

public sealed class StringOperation: System.MulticastDelegate  
{  
   public StringOperation (object target, int method);  
   public virtual void Invoke(string myString);  
   public virtual IAsyncResult BeginInvoke(string myString,  
   AsyncCallback callback, object obj);  
   public virtual void EndInvoke(IAsyncResult result);  
}

我的问题是,当类本身是virtual类时,为什么它会生成sealed个方法?

创建virtual方法没有意义,因为我们无法override他们正确吗?

1 个答案:

答案 0 :(得分:0)

我不熟悉框架的这一部分,但是Reflector将此作为BeginInvoke的定义:

[MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]
public virtual IAsyncResult BeginInvoke(string myString, AsyncCallback callback, object @object);

我的眼睛被MethodImpl属性所吸引。 MethodCodeType.Runtime表示:

  

指定方法实现由运行时提供。

所以我猜它是virtual因为运行时会覆盖它的功能。运行时可以轻松传递sealed类。