c# – 为什么可以从同一方法的覆盖版本调用方法的基本版本

我很困惑为什么C#让我这样做:

基类

public virtual void OnResultExecuted(ResultExecutedContext filterContext)
{

}

派生类

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    base.OnResultExecuted(filterContext);
}

这段代码没有问题.但它是如何调用base.OnResult当这是我重写的方法时执行了?

解决方法

为什么这很有用是非常明显的. “怎么样?”不太明显,但也很有趣.

存储.NET代码的MSIL编码有两个方法调用指令:

>打电话
> callvirt

不同之处在于,当callvirt与虚方法一起使用时,它不会调用指示的方法.相反,它将指示的方法映射到对象类的vtable中的一个槽,找到属于该对象类的实际实现,并调用该版本.

(对于非虚方法,callvirt只是添加一个空检查,然后直接调用指定的方法).

调用指令不使用vtable.它只是调用MSIL中指定的方法.在C#中使用base关键字时,编译器会生成一个调用指令,以便使用基类提供的确切方法,而不是vtable中链接的重写方法.

此行为是documented on MSDN for the call opcode

It is valid to call a virtual method using call (rather than callvirt); this indicates that the method is to be resolved using the class specified by method rather than as specified dynamically from the object being invoked.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...