当声明为类的一部分时,ValueType是否会被装箱?

时间:2010-11-18 15:41:57

标签: c# .net memory-management boxing unboxing

考虑这个课程:

public class Foo
{
    public Int32 MyField;
}

我想“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,但它必须绝对在托管堆中,但这是否意味着它每次使用时都会被装箱并取消装箱?

提前致谢

4 个答案:

答案 0 :(得分:8)

不,每次使用时都不会装箱。只有在将值类型强制转换为引用类型时才会发生限制 - 它实际上与分配值的实际内存(或者即使分配了任何内存)无关。

在你的情况下,你是如何在MyField上采取行动来确定它是否被装箱,而不是如何对待Foo。

  //No Boxing
  var f = new Foo();
  f.MyField = 5;
  int val = f.MyField;


  //Boxing
  var f = new Foo();
  f.MyFIeld = 5;
  object val = f.MyField;

请注意,在第二个示例中,val现在包含对boxed int的引用。 MyField仍然(并将永远保留)一个未装箱的int,无需拆箱即可访问(感谢指出所需的澄清,LukeH

答案 1 :(得分:2)

不,值类型没有框。

只有在使用值类型时才会出现拳击,就像它是一个对象一样,例如在int数组中存储object时。那就是:

object[] a = new object[10];
int x = 1;
a[0] = x;

在这种情况下,值类型将被装箱。

但是在类中存储为字段的值类型不会装箱。

答案 2 :(得分:2)

不,仅当将值类型视为System.Object时(通常通过隐式转换,即将其作为方法参数传递),才会发生装箱。

答案 3 :(得分:1)

值类型仅在分配给引用类型变量(例如object)时才会被加框。如果你永远不会将MyField分配给int或其他结构以外的任何东西(例如double),它就不会被装箱。