考虑到这个类:
public class Foo
{
public Int32 MyField;
}
我猜“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,它必须肯定在托管堆中,但这是否意味着它每次使用时都被装箱和拆箱?
提前致谢
考虑到这个类:
public class Foo
{
public Int32 MyField;
}
我猜“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,它必须肯定在托管堆中,但这是否意味着它每次使用时都被装箱和拆箱?
提前致谢
不,它不是每次使用时都装箱。仅当您将值类型强制转换为引用类型时才会发生装箱 - 它实际上与分配值的实际内存的位置(或者即使分配了任何内存)无关。
在您的情况下,您对 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)
不,值类型未装箱。
仅当您将值类型当作对象使用时才会发生装箱,例如将 an 存储int
在object
. 那是:
object[] a = new object[10];
int x = 1;
a[0] = x;
在这种情况下,值类型被装箱。
但是在类中存储为字段的值类型不会被装箱。
不,只有当值类型被视为 System.Object 时才会发生装箱(通常通过隐式转换,即将其作为方法参数传递)
值类型只有在分配给引用类型变量(例如object
)时才会被装箱。如果您从不分配MyField
给除 int 或其他可以强制转换的结构以外的任何内容(例如double
),则它永远不会被装箱。