假设有这样一个声明:
class A
{
public void virtual AMethod()
{
}
}
class B: A
{
override …
public void BMethod()
{
}
}
class Client
{
A a = new B();
a.AMethod();
B b = new B();
b.BMethod();
}
此时,.net 编译的时候会产生IL指令: callvirt来调用AMethod,产生call指令来调用BMethod;
call指令用来调用声明方法,而callvirt指令用来调用实际方法,因此callvirt指令需要在运行时检查对象的实际类型,如果该对象为null,则抛出NullReferenceException异常.