我最近遇到的另一个 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,它是。但这根本不是装箱/拆箱的例子,对吗?那么你会如何总结这一点呢?
在装箱/拆箱转换中,这些值是否会变得与上述相同?