如何解决因此在c#中int没有同步块索引,也没有对类型对象的引用 CLR如何知道要启动什么ToString方法?
所有原始类型都覆盖ToString()和其他方法(例如==运算符),但是CLR如何知道调用哪个方法(如果它没有指向类型对象的指针)?对于原始类型,如果我理解正确的话,就没有Sync块索引,也没有对类型对象的引用-只有堆栈中保存的值。
我在哪里错了?
解决方法
对于值类型,没有继承作用。这意味着变量的类型足以确定确切地被调用的方法。
反过来,这意味着编译器将发出call
条指令,而不是callvirt
,这意味着CLR不需要使用运行时类型信息来调用该方法。
是的,确实值类型没有对类型对象的引用,也没有SyncBlockIndex。这就是为什么当您调用诸如GetType()或MemberwiseClone()之类的非虚拟方法时,编译器会将它们装箱的原因。诸如Equals(),GetHashCode()和ToString()之类的虚拟方法被覆盖并烘焙为值类型,甚至转化为我们创建的值类型并进行密封,这就是为什么可以在不引用类型对象的情况下调用它们的原因。而且,如果我们自己重写这些方法,并在重写内部调用该方法的基本实现,则在调用我们的重写方法时,值类型将始终处于空白状态。
资料来源:里希特。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。