CLR如何调用虚方法、属性和事件

属性和方法实际上是做为方法调用的。
CLR为方法的调用提供了两个IL指令:
  • IL指令call可以用来调用静态方法、实例方法和虚方法。使用call指令调用静态方法时,必须指定CLR要调用的方法的类型。使用call指令调用实例方法或者虚方法时,必须指定使用变量来引用对象。call指令假定变量不能为null,换句话说,也就是变量本身的类型指出了用什么类型定义CLR要调用的方法。如果变量的类型没有定义方法,则检测基础类型来匹配方法。指定call通常用来非虚拟地调用虚方法。
  • IL指令callvirt用来调用实例方法和虚方法,而不能用来调用静态方法。使用callvirt指令调用实例方法或者虚方法时,必须指定变量来引用变量。使用IL指令callvirt指令调用非虚方法实例方法时,变量的类型指出了用什么类型定义CRL要调用的方法。使用IL指令callvirt调用虚实例方法时,CLR查找用来调用的变量通常不能为null,换句话说,也就是编译时该调用时,JIT编译器生成验证变量是否为null的代码,如果变量为null,callvirt指令引发CLR抛出一个NullReferenceException异常。这种额外的检查意味着IL指令callvirt的执行速度比call指令稍慢。注意,即使callvirt指令用来调用非虚实例方法时,也要执行这种变量是否为null的检查。
原文地址:https://www.cnblogs.com/qishichang/p/1456286.html