有点学术问题,但是:价值类型如何像Int实际上工作?Value类型如何在.net中工作?
我在mscorlib上使用了Reflector来了解System.Int32是如何实现的,它只是一个从System.ValueType继承的Struct。我正在寻找一个位数组中的值来保存值,但我只找到一个声明为int的字段 - 这意味着它是一个循环引用?
我的意思是,我可以写“int i = 14;”,但数字14需要以某种方式存储在某处,但我无法找到“32位数组”或指针或其他东西。
这是编译器所做的一些神奇的事情吗?这些神奇的类型是规范的一部分吗? (类似于System.Attribute或System.Exception如何是“特殊”类型)
编辑:如果我声明我自己的结构,我向它添加字段。这些字段是内置类型的,例如int。所以CLR知道我拥有一个int。但是它是如何知道int是32位的?这只是说明规范指定了某些基本类型,因此使它们变得“神奇”,还是存在技术机制?假设的例子:如果我想要声明一个Int36,这是一个36位的整数,我可以创建一个类似于Int32的,正如,除了4个额外的位之外,通过指定“好吧,搁置36比特“,还是内置的原语设置石头,我不得不以某种方式解决这个问题(即通过使用Int64和代码,只设置最后36位)?
正如所说,所有非常学术和假设的,但我总是想知道这一点。
其实很好的问题,我想知道自己的魔法是什么。 – Pierreten
我也是,我期待这个问题是关于价值类型如何工作,即堆栈和堆分配等,但我对此自我感到好奇。 – Davy8
重新编辑:据我所知,如果你想创建一个Int36,你将不得不以某种方式在C#或IL中指定它,这将迫使你使用Int32 + Int8或Int64以及最后的28个位被忽略或者其他。将Int36添加到原始底层虚拟机并让它理解位级表示的唯一方法是实现您自己的CLR a la Mono或Rotor。 – itowlson