对ValueType赋值进行装箱

本文关键字:ValueType 赋值 | 更新日期: 2023-09-27 18:06:56

如果我分配一个简单的值类型(例如一个int)到ValueType类型的属性,值然后装箱吗?

例如:

int i = 4;
ValueType test = i;

值将被框化吗?

对ValueType赋值进行装箱

会的。这是因为每种类型在运行时占用恒定数量的内存(例如,int占用4字节)。一个结构体将占用尽可能多的空间来布置内存中的所有字段。

由于您可以在ValueType中存储任何值类型,并且由于ValueType必须与您分配给test的类型完全相同的大小,因此ValueType类型实际上是引用类型。

考虑:

int a = 0;
long b = 1;
ValueType test;
test = a;
test = b;

这是完全有效的代码。test必须占用固定的堆栈大小,ab的大小不同。希望这能澄清为什么ValueType本身不能是一个值类型。(这与不能派生值类型的原因有关)

是的,这将把它框起来- ValueType是一个引用类型(一个类),足够令人困惑:)它只是每个值类型"继承"的类型(直接在结构体的情况下,间接在枚举的情况下)。

当您将值类型值赋值给引用类型的变量时,包括object, ValueType, Enum和任何接口,都会发生装箱。(当使用值类型value作为参数,而参数是这些类型之一时,也会发生这种情况,等等)

ValueType是一个引用类型。在此赋值中生成的IL实际上将结构体框起来。

下面是一个赋值给object的方框指令的例子:

void Main()
{
    object o = 1;
    Console.Write(o);
}
IL_0000:  ldc.i4.1    
IL_0001:  box         System.Int32
IL_0006:  stloc.0     
IL_0007:  ldloc.0     
IL_0008:  call        System.Console.Write

当赋值给ValueType时:

void Main()
{
    ValueType o = 1;
    Console.Write(o);
}
IL_0000:  ldc.i4.1    
IL_0001:  box         System.Int32
IL_0006:  stloc.0     
IL_0007:  ldloc.0     
IL_0008:  call        System.Console.Write