考虑这个课程:
public class Foo
{
public Int32 MyField;
}
我想“MyField”成员不在线程堆栈上,因为它可以被多个线程访问,但它必须绝对在托管堆中,但这是否意味着它每次使用时都会被装箱并取消装箱?
提前致谢
答案 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
),它就不会被装箱。