拳击分配给ValueType?

时间:2011-08-26 13:43:30

标签: c#

如果我将一个简单的值类型(例如int)分配给ValueType类型的属性,那么该值是否已装箱?

例如,如果我这样做:

int i = 4;
ValueType test = i;

该值会被装箱吗?

3 个答案:

答案 0 :(得分:6)

是的,它会的。这是因为每种类型在运行时占用一定量的内存(例如,int占用4个字节)。结构将占用内存中所有字段所需的空间。

由于您可以在ValueType中存储任何值类型,因为ValueType必须与您分配给{{1}的类型完全相同{},test类型实际上是一种引用类型。

考虑:

ValueType

这是完全有效的代码。 int a = 0; long b = 1; ValueType test; test = a; test = b; 必须在堆栈上占用固定的大小,testa的大小不同。希望这可以澄清为什么b本身不能成为值类型。 (这与你无法推导出价值类型的原因有关。)

答案 1 :(得分:4)

是的,那会把它包装好 - ValueType是一个引用类型(一个类),令人困惑:)这只是每个值类型“继承”的类型(直接在结构的情况下,间接地在枚举的情况下)。

只要您将值类型值分配给引用类型的变量(包括objectValueTypeEnum和任何接口,就会发生限制。 (当使用值类型值作为参数是其中一种类型的参数时,也会出现这种情况。)

答案 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