对ValueType赋值进行装箱
本文关键字:ValueType 赋值 | 更新日期: 2023-09-27 18:06:56
如果我分配一个简单的值类型(例如一个int)到ValueType类型的属性,值然后装箱吗?
例如:
int i = 4;
ValueType test = i;
值将被框化吗?
会的。这是因为每种类型在运行时占用恒定数量的内存(例如,int
占用4字节)。一个结构体将占用尽可能多的空间来布置内存中的所有字段。
由于您可以在ValueType
中存储任何值类型,并且由于ValueType
必须与您分配给test
的类型完全相同的大小,因此ValueType
类型实际上是引用类型。
考虑:
int a = 0;
long b = 1;
ValueType test;
test = a;
test = b;
这是完全有效的代码。test
必须占用固定的堆栈大小,a
和b
的大小不同。希望这能澄清为什么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