c# - 为什么Invoke BeginInvoke和EndInvoke在内部类密封的情况下是虚的?

标签 c# delegates

<分区>

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

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

我的问题是,当类本身是一个密封类时,为什么它会生成虚拟方法?

创建虚拟方法没有意义,因为我们不能覆盖它们,对吧?

最佳答案

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

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

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

Specifies that the method implementation is provided by the runtime.

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

关于c# - 为什么Invoke BeginInvoke和EndInvoke在内部类密封的情况下是虚的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582406/

相关文章:

c# - 如何在 C# 项目中构建单元测试引用

c# - Struct 不缓存,但 Class 缓存

c# - 将 Action<T> 转换为 Func<T,Tres> 的最佳方法是什么?

c# - 尝试设置委托(delegate)和处理程序以仅使用操作键动态调用

c# - 无法将 lambda 表达式转换为类型 'System.Delegate' 因为它不是委托(delegate)类型?

c# - 在 C# 中使用泛型参数调用委托(delegate)

c# - ASP.NET 身份验证 cookie

c# - Xamarin Forms 没有为 UITest 设置 StyleId

c# - WinForms 中的 CefSharp - ExecuteScriptAsync 或 EvaluateScriptAsync 不起作用

ios - Swift 中的惰性函数