2

可能的重复:
什么是装箱和拆箱,权衡取舍是什么?

嗨,根据我的理解:当我将值类型的数据分配给(引用)类型对象变量时,它会被装箱并且结果不是实际引用,因为它指向存储在堆上的值的副本。是对的吗?谢谢

4

3 回答 3

6

嗯,不完全。(我一开始就误读了你的帖子。)

结果一个真正的参考 - 但它不参考您的原始变量。它指的是堆上的一个对象,其中包含发生装箱时变量所持有的值的副本。特别是,更改变量的值不会更改框中的值:

int i = 10;
object o = i;
i = 11;
Console.WriteLine(o); // Prints 10, not 11

C# 不允许您直接访问框内的值 - 您只能通过拆箱并获取副本来获取它。另一方面,C++/CLI 允许单独访问框内的值,甚至可以更改。(您仍然可以使用 C# 更改框中的值 - 例如,如果值类型实现了某些接口并且接口方法改变了值。)

通常导致装箱的引用类型是“对象”,但它可能是值类型实现的某个接口,或者只是System.ValueType.

于 2011-01-19T07:53:24.203 回答
1

这可能会帮助你

int i = 1;
object o = i;   // boxing on the heap
int j = (int) o;    // unboxing to the stack
于 2011-01-19T07:54:20.873 回答
0

是的,对于第一部分,将值类型分配给引用变量将使用装箱。基本上在需要引用类型的任何上下文中使用值类型都会将值装箱。

是的,(在当前实现中)装箱操作会将值类型复制到堆中,并返回对该位置的引用,即使该值已经在堆上(例如对象的值类型属性),所以你不会得到对原始值变量的引用,但这无论如何都是一个实现细节,因为值类型应该被视为不可变的。

于 2011-01-19T07:57:57.760 回答