【问题标题】:Why Invoke BeginInvoke & EndInvoke are virtual when internal class is sealed? [duplicate]为什么 Invoke BeginInvoke 和 EndInvoke 在内部类被密封时是虚拟的? [复制]
【发布时间】:2018-02-02 12:10:51
【问题描述】:

我观察到,每当编译器遇到如下委托声明时:

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);  
}

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

创建virtual 方法没有意义,因为我们不能override 他们对吗?

【问题讨论】:

  • 您是如何获得该代码的?
  • 我读过以下文章:link。当我签入 ildasm 时,它显示了相同的密封和虚拟概念。

标签: c# delegates


【解决方案1】:

我不熟悉这部分框架,但是 Reflector 给出了 BeginInvoke 的定义:

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

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

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

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

【讨论】:

  • 哦,好吧,我明白了。谢谢伙计..!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
相关资源
最近更新 更多