因此在c#中int没有同步块索引,也没有对类型对象的引用 CLR如何知道要启动什么ToString方法?

问题描述

所有原始类型都覆盖ToString()和其他方法(例如==运算符),但是CLR如何知道调用哪个方法(如果它没有指向类型对象的指针)?对于原始类型,如果我理解正确的话,就没有Sync块索引,也没有对类型对象的引用-只有堆栈中保存的值。

我在哪里错了?

解决方法

对于值类型,没有继承作用。这意味着变量的类型足以确定确切地被调用的方法。

反过来,这意味着编译器将发出call条指令,而不是callvirt,这意味着CLR不需要使用运行时类型信息来调用该方法。

,

是的,确实值类型没有对类型对象的引用,也没有SyncBlockIndex。这就是为什么当您调用诸如GetType()或MemberwiseClone()之类的非虚拟方法时,编译器会将它们装箱的原因。诸如Equals(),GetHashCode()和ToString()之类的虚拟方法被覆盖并烘焙为值类型,甚至转化为我们创建的值类型并进行密封,这就是为什么可以在不引用类型对象的情况下调用它们的原因。而且,如果我们自己重写这些方法,并在重写内部调用该方法的基本实现,则在调用我们的重写方法时,值类型将始终处于空白状态。

资料来源:里希特。