如果我将一个简单的值类型(例如int)分配给ValueType类型的属性,那么该值是否已装箱?
例如,如果我这样做:
int i = 4;
ValueType test = i;
该值会被装箱吗?
答案 0 :(得分:6)
是的,它会的。这是因为每种类型在运行时占用一定量的内存(例如,int
占用4个字节)。结构将占用内存中所有字段所需的空间。
由于您可以在ValueType
中存储任何值类型,因为ValueType
必须与您分配给{{1}的类型完全相同{},test
类型实际上是一种引用类型。
考虑:
ValueType
这是完全有效的代码。 int a = 0;
long b = 1;
ValueType test;
test = a;
test = b;
必须在堆栈上占用固定的大小,test
和a
的大小不同。希望这可以澄清为什么b
本身不能成为值类型。 (这与你无法推导出价值类型的原因有关。)
答案 1 :(得分:4)
是的,那会把它包装好 - ValueType
是一个引用类型(一个类),令人困惑:)这只是每个值类型“继承”的类型(直接在结构的情况下,间接地在枚举的情况下)。
只要您将值类型值分配给引用类型的变量(包括object
,ValueType
,Enum
和任何接口,就会发生限制。 (当使用值类型值作为参数是其中一种类型的参数时,也会出现这种情况。)
答案 2 :(得分:0)
ValueType
是参考类型。在此赋值上生成的IL实际上是对结构进行封装。
以下是分配给对象时框指令的示例:
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