Value类型如何在.net中实际工作?

Mic*_*tum 5 .net

有点学术问题,但是:像Int这样的价值类型实际上是如何运作的

我在mscorlib上使用了Reflector来了解System.Int32是如何实现的,它只是一个继承自System.ValueType的Struct.我正在寻找包含该值的数组的行中的某些东西,但我只发现了一个声明为int的字段 - 这意味着它是一个循环引用?

我的意思是,我可以写"int i = 14;",但是数字14需要以某种方式存储在某处,但我找不到"32位数组"或指针或其他东西.

这是编译器所做的一些魔术吗?这些魔术类型是规范的一部分吗?(类似于System.Attribute或System.Exception是"特殊"类型)

编辑:如果我声明自己的结构,我添加字段.这些字段是内置类型,例如int.所以CLR知道我持有一个int.但它如何知道int是32位,签名?仅仅是规范指定了某些基本类型并因此使它们"神奇",还是有技术机制?假设示例:如果我想要声明一个Int36,即36位的整数,我可以通过指定"好的,预留36位"来创建一个与Int32 完全相同的类型(除了4个额外的位) ,或者是内置的原语,我必须以某种方式解决这个问题(即使用Int64和仅设置最后36位的代码)?

如上所述,所有非常学术和假设,但我总是对此表示疑惑.

ito*_*son 3

某些基本类型(例如整数)是 CLI 规范的一部分。例如,有特定的 IL 指令(如 ldc.i4)用于加载这些类型的值,并且 IL 指令(如 add)具有这些类型的特定知识。(您的示例int i = 14将被编译为ldc.i4 14,其中 14 在内部表示为已编译的 MSIL 中操作码的一部分。)

有关详细信息,请参阅CLI 规范的第 IIa 部分,第 7.2 节“内置类型”。(抱歉,找不到特定部分的链接。)内置类型有:bool、char、object、string、float32、float64、int[8|16|32|64]、unsigned int[8| 1632|64]、本机 int (IntPtr)、本机无符号 int 和 typedref。规范指出它们“在基类库中定义了相应的值类型”,这让我认为 Int32 实际上是一种围绕“真实”int32 的元数据包装器,它存在于 VES 级别。

其他值类型,例如 System.Decimal、System.Drawing.Point 或您在自己的代码中定义的任何结构,都是非魔法的。