最近的另一个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,它是。但是,这不是一个例子拳/拆箱,这是正确的?所以你将如何总结这个吗?

可能的价值观以往任何时候都成为同一个拳击/拆箱的转换如上?

有帮助吗?

解决方案

  1. 你是对第二次转让替换第一次。它不会改变装箱的价值。

  2. 你的例子不会使用的拳击。值(int)被储存作为一个整数和未装箱。

  3. 不,拳击仍然保持不变性的保证。

其他提示

非常短:拳击手段 创建一个新的实例基准类型.如果你知道这一点,你明白的一个实例并不改变,通过创造另一个。

你是什么做 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)-目堆?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top