当被声明为类的一部分做了值类型绿篱?
-
26-09-2019 - |
题
考虑到这一类:
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
)其他任何东西,它永远不会被装箱。
不隶属于 StackOverflow