2010-03-27 58 views
4

查看网络并找不到任何有关如何实现值类型的文章。如何在.NET中实现值类型

例如,一个Int32是一个结构,它的直接父是System.ValueType,这就是最终母公司为System.Object的。对象是一个类 - 我想ValueType是一个类?

什么是类层次结构? CLR应该扮演什么角色? CLR在什么阶段知道如何将值类型分配给堆栈? (仅供参考,我知道值类型存储在声明的位置)。

回答

1

烟雾和镜子是描述它的最好方式。我会尝试更好。值类型不支持继承,并且不能有虚拟方法。但是,int类型具有ToString()和GetHashCode()方法,都是虚拟方法。它从System.Object继承它们。

这个魔法来自拳击转换。有执行它的专用IL操作码,OpCodes.Box和OpCodes.Constrained。这将一个值类型转换为一个对象,一个存储原始值类型的值。它也相反,拆箱将对象转换回值类型。

如果你有一个很好的.NET编译,就像C#的,你从来没有明确自己调用转换。当需要这种转换时,编译器可以从语言语法中找出并发出所需的IL代码。

System.Int32类型是编译器特有的帮助类型。它仅适用于其方法,您从不明确创建它的实例。编译器在知道你正在调用int“class”的方法时直接调用这些方法。

所有这一切都一起工作,以创建诠释导出从System.Object(通过System.ValueType)的错觉。使用“如果看起来像鸭子一样游泳和跳蚤,它就是一只鸭子”的原则。

+0

对于一些继承的System.Object方法还存在一些诡计 - 例如下面的方法不执行装箱操作: int i = 5; i.ToString(); – Michael 2010-03-27 11:48:29

+0

它为什么要装箱?什么都没有说,当一个父类的方法被调用时,类型会被上传? – Dykam 2010-03-27 12:06:05

+0

这就是System.Int32帮助程序类型的步骤。 – 2010-03-27 12:19:06

1

值类型由各种语言编译器和CLR特别处理。很简单,CLR知道从ValueType派生的所有东西都是按值传递的,而且本地的ValueType变量存在于堆栈中。

我不知道它是如何更可以说大约值类型,而游荡到的“实现定义”的境界。

1

在这种情况下,类层次结构是有点人为的。无论类型是引用还是值类型都直接存储在类型元数据中,因此CLR不需要查看它是否从System.ValueType派生。但是System.ValueType确实有点帮助 - 它实现了值平衡检查和GetHashCode()。

的CLR堆栈对于被标记为在它的元数据的“.class值”的类型的任何局部变量上分配空间。什么时候发生这种情况取决于代码是否被优化。如果它没有被优化,那么它会在声明中发生以帮助调试。如果它可能会尽可能晚地进行优化,但这取决于实施。

我不确定还有什么要说的,因为你的问题目前的措辞很广泛。

+0

噢,抱歉它是一个有点广阔的 - 我只是没有在书和博客等发现很多细节上的这一点 - 最终,我不*需要*知道这种事情,但它是相当有趣的是知道怎么会事发生你可能认为理所当然的事情。我想我读过的一些最好的信息是通过C#书中的新CLR,但还是有些东西没有包含。 – Michael 2010-03-27 11:35:05