我很困惑为什么C#让我这样做:
基类
public virtual void OnResultExecuted(ResultExecutedContext filterContext) { }
派生类
public override void OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); }
解决方法
为什么这很有用是非常明显的. “怎么样?”不太明显,但也很有趣.
>打电话
> 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 thancallvirt
); 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.