拳击..我做对了吗?

时间:2011-01-19 07:51:22

标签: c# .net boxing

  

可能重复:
  What is boxing and unboxing and what are the trade offs?

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

3 个答案:

答案 0 :(得分:6)

嗯,不是相当。 (我误读了你的帖子。)

结果 是一个真正的引用 - 但它并不是指你原来的变量。它指的是堆上的一个对象,它包含变量在装箱时所持有的值的副本。特别是,更改变量的值不会更改框中的值:

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

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

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

答案 1 :(得分:1)

这可能对您有所帮助

int i = 1;
object o = i;   // boxing on the heap
int j = (int) o;    // unboxing to the stack

答案 2 :(得分:0)

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

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