我很困惑为什么C#让我这样做:
基类
public virtual void OnResultExecuted(ResultExecutedContext filterContext)
{
}
Run Code Online (Sandbox Code Playgroud)
派生类
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
这段代码没有问题.但它是如何调用base.OnResult当这是我重写的方法时执行了?
为什么这很有用是非常明显的."怎么样?" 不太明显,但也很有趣.
存储.NET代码的MSIL编码有两个方法调用指令:
callcallvirt不同之处在于,当callvirt与虚方法一起使用时,它不会调用指示的方法.相反,它将指示的方法映射到对象类的vtable中的一个槽,找到属于该对象类的实际实现,并调用该版本.
(对于非虚方法,callvirt只需添加一个空检查,然后直接调用指定的方法).
该call指令不使用vtable.它只是调用MSIL中指定的方法.base在C#中使用关键字时,编译器会生成一条call指令,以便使用基类提供的确切方法,而不是在vtable中链接的重写方法.
使用
call(而不是callvirt)调用虚方法是有效的; 这表明该方法是使用方法指定的类而不是从被调用的对象动态指定的.