我最近遇到的另一个 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,确实如此。但这根本不是装箱/拆箱的例子,对吗?那么你会如何总结呢?
装箱/拆箱转换中的值能否与上述相同?
最佳答案
非常简短:装箱意味着创建引用类型的新实例。如果您知道这一点,您就会明白一个实例不会因创建另一个实例而改变。
您对 a = 2
所做的并不是更改“框中”中的值,而是创建一个引用类型的新实例。那么为什么还要改变其他东西呢?
关于c# - 装箱与拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/764216/