题
最近的另一个C#访问问题,我已经是如果我知道什么是拳击和拆箱。我解释说,值的类型是在堆和基准类型堆。当一个值转换为一个基准类型,我们呼吁它拳击,反之亦然。
然后他问我到计算这样的:
int i = 20;
object j = i;
j = 50;
是什么 i
?
我搞砸了,说50,它实际上是20.现在我觉得它理解为什么,但是,当我在玩的不同组合,我很惊讶地看到这一点:
Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing
我期待看到 b == 2
为好,但这不是,为什么?这是因为第二拳击破坏和替代整个 a
目堆?
因为如果我这样做,它的罚款:
public class TT
{
public int x;
}
TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;
是什么 t2.x
?它应该是3,它是。但是,这不是一个例子拳/拆箱,这是正确的?所以你将如何总结这个吗?
可能的价值观以往任何时候都成为同一个拳击/拆箱的转换如上?
解决方案
你是对第二次转让替换第一次。它不会改变装箱的价值。
你的例子不会使用的拳击。值(int)被储存作为一个整数和未装箱。
不,拳击仍然保持不变性的保证。
其他提示
非常短:拳击手段 创建一个新的实例基准类型.如果你知道这一点,你明白的一个实例并不改变,通过创造另一个。
你是什么做 a = 2
是不断变化的价值中的"盒子",你正在创建一个新的实例基准类型。那么,为什么要别的什么改变?
我期待看到b==2, 但这不是,为什么?还是因为 第二拳击破坏和替换 整个(a)-目堆?
不,不完全。它留下的对象,因为它是在堆(作为 b
变量也是引用),并创建一个新的对象的新的价值, a
变量的参考。
你是对的,你的第二个实例中并未使用拳击。你不能访问的价值,这是盒装的任何其他方式拆箱,所以没有办法改变一个装箱的价值。
甚至不是一个可变的结构喜欢 Point
可以改变的时装箱。访问的性质的结构你必须拆箱,所以你不能改变的装箱的结构。
这里是另一个有趣的变化,支持Stefan的评论:
int i = 2;
object a = i; // Boxing
object b = a; // Referencing same address on heap as 'a', b == a
b = i; // New boxing on heap with reference new address, b != a
b仍然是1,因为b是一个参考,仍点对象堆上的价值为1。一个是2因为你分配到一个新的对象堆上的价值为2。
t2。x3,因为t和t2是两个不同的引用相同的对象堆。
我想回答你的问题与拆箱是:结果一个箱转换是临时变量(更多详细信息: 链接).
我想你是在试图做的sth,如:
object a = new Point(10,10);
object b = new Point(20,20);
a = b;
((Point) b).X = 30; //after this operation also a.X should be 30
上述代码不会编制的详细信息的链接上述,我认为这是回答你的问题:
我期待看到b==2, 但这不是,为什么?还是因为 第二拳击破坏和替换 整个(a)-目堆?