可能重复:
What is boxing and unboxing and what are the trade offs?
嗨,根据我的理解:当我将值类型的数据分配给(引用)类型对象变量时,它会被装箱,结果不是实际引用,因为它指向堆中存储的值的副本。是那么回事吗?谢谢
发布于 2011-01-19 07:53:24
嗯,不完全是。(我一开始看错了你的帖子。)
结果是一个真正的引用,但它并不引用原始变量。它引用堆中的一个对象,该对象包含在装箱发生时保存的变量值的副本。特别是,更改变量的值并不会改变方框中的值:
int i = 10;
object o = i;
i = 11;
Console.WriteLine(o); // Prints 10, not 11C#不允许您直接访问框内的值--您只能通过取消装箱和获取副本来获得它。另一方面,C++/CLI允许单独访问框内的值,甚至更改。(您仍然可以使用C#更改框中的值-例如,如果值类型实现了某些接口,而接口方法对值进行了变异。)
通常,导致装箱的引用类型是"object“,但它可能是值类型实现的一些接口,或者仅仅是System.ValueType。
发布于 2011-01-19 07:54:20
这可能对你有帮助
int i = 1;
object o = i; // boxing on the heap
int j = (int) o; // unboxing to the stack发布于 2011-01-19 07:57:57
是的,对于第一部分,将值类型分配给引用变量将使用装箱。基本上,在任何需要引用类型的上下文中使用值类型都会将值框化。
是的,(在当前实现中)装箱操作将将值类型复制到堆中,并返回对该位置的引用,即使该值已经在堆上(例如,对象的值类型属性),所以您不会获得对原始值变量的引用,但这是实现细节,因为值类型应该被视为不可变。
https://stackoverflow.com/questions/4732925
复制相似问题