3

考虑到这个类:

public class Foo
{
    public Int32 MyField;
}

我猜“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,它必须肯定在托管堆中,但这是否意味着它每次使用时都被装箱和拆箱?

提前致谢

4

4 回答 4

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现在包含对装箱 int 的引用。 MyField仍然(并且将永远保持)一个未装箱的 int 并且可以在没有拆箱的情况下访问(感谢您指出需要的澄清,LukeH

于 2010-11-18T15:47:57.960 回答
2

不,值类型未装箱。

仅当您将值类型当作对象使用时才会发生装箱,例如将 an 存储intobject. 那是:

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

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

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

于 2010-11-18T15:47:15.027 回答
2

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

于 2010-11-18T15:48:00.460 回答
1

值类型只有在分配给引用类型变量(例如object)时才会被装箱。如果您从不分配MyField给除 int 或其他可以强制转换的结构以外的任何内容(例如double),则它永远不会被装箱。

于 2010-11-18T15:48:25.420 回答