繁体   English   中英

如何在纯结构中覆盖ValueType之类的ToString()之类的方法?

[英]How are methods like ToString() from ValueType overriden in a plain struct?

所有其他值类型(除struct外,忽略可为空的版本)都使用额外的结构(如Int32 )或类( Enum )来覆盖ValueType方法。 但是,在struct的情况下,没有这样的事情,因为struct直接(隐式地)从ValueType 因此,重写ValueType的方法的机制是什么?

例如,使用ToString()在struct变量上运行。 特定于struct的ToString()的代码在哪里? 该代码似乎来自ValueType本身,例如

    public override String ToString()
    {
         return this.GetType().ToString();
    }

GetType()定义为“ extern ”(NET不提供其源代码)。 因此,不是使用基于类层次结构的替代方法,C#是否使用非文档化方法来获取有关面向对象模型之外的派生对象的信息?

您正在谈论对约束类型的虚拟方法调用。 答案可以在一些晦涩的小字体中找到

当callvirt方法指令以约束thisType为前缀时,该指令将按以下方式执行:

  • ...

  • 如果thisType是值类型,并且thisType不实现方法,则将ptr取消引用,装箱并作为“ this”指针传递给callvirt方法指令。

仅当在Object,ValueType或Enum上定义了方法并且没有被thisType覆盖时,才可能发生后一种情况。 在这种情况下,装箱将生成原始对象的副本。 但是,由于Object,ValueType和Enum的任何方法都不能修改对象的状态,因此无法检测到此事实。

简而言之,魔术是由于拳击而发生的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM