问题描述
所有原始类型都覆盖ToString()和其他方法(例如==运算符),但是CLR如何知道调用哪个方法(如果它没有指向类型对象的指针)?对于原始类型,如果我理解正确的话,就没有Sync块索引,也没有对类型对象的引用-只有堆栈中保存的值。
我在哪里错了?
解决方法
对于值类型,没有继承作用。这意味着变量的类型足以确定确切地被调用的方法。
反过来,这意味着编译器将发出call
条指令,而不是callvirt
,这意味着CLR不需要使用运行时类型信息来调用该方法。
是的,确实值类型没有对类型对象的引用,也没有SyncBlockIndex。这就是为什么当您调用诸如GetType()或MemberwiseClone()之类的非虚拟方法时,编译器会将它们装箱的原因。诸如Equals(),GetHashCode()和ToString()之类的虚拟方法被覆盖并烘焙为值类型,甚至转化为我们创建的值类型并进行密封,这就是为什么可以在不引用类型对象的情况下调用它们的原因。而且,如果我们自己重写这些方法,并在重写内部调用该方法的基本实现,则在调用我们的重写方法时,值类型将始终处于空白状态。
资料来源:里希特。