考虑到这一类:

public class Foo
{
    public Int32 MyField;
}

我想“MyField的”成员不是线程堆栈上,因为,因为它可以由多个线程访问,它必须是肯定在托管堆,但它意味着它被装箱和取消装箱每次它使用?

在预先感谢

有帮助吗?

解决方案

没有,所以不盒装每次使用的时间。拳击只有当你强迫值类型为引用类型发生 - 它真的没有任何关系与在该值的实际分配内存(或者即使任何分配内存)。

在你的情况,这是你如何作用于MyField的,将决定它是否盒装,而不是如何富的治疗。

  //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

其他提示

没有,值类型不装箱。

拳击仅当您使用的值类型,就好像它是一个对象,例如存储int阵列的object时发生。是:

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

在这种情况下,值类型是盒装。

但是,存储为一个字段一个类中的值类型不装箱。

没有,只有当拳击值类型作为一个System.Object(通常由隐式浇铸,即通过它作为方法参数)

处理发生

值类型仅得到时,他们指派给引用类型变量(例如object)装箱。如果你从来没有分配MyField到比int或其他结构来它可以转换(例如double)其他任何东西,它永远不会被装箱。

scroll top