Hou*_*man 28 c# boxing unboxing
我最近的另一个C#面试问题是,如果我知道Boxing和Unboxing是什么.我解释了堆上的值类型和Heap上的引用类型.当一个值转换为引用类型时,我们将其称为装箱,反之亦然.
然后他让我计算一下:
int i = 20;
object j = i;
j = 50;
Run Code Online (Sandbox Code Playgroud)
什么是i?
我把它搞砸了,然后说了50,它实际上是20.现在我想明白为什么,但是当我玩不同的组合时,我很惊讶地看到这个:
Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing
Run Code Online (Sandbox Code Playgroud)
我期待也能看到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;
Run Code Online (Sandbox Code Playgroud)
什么是t2.x?它应该是3,它是.但这不是拳击/拆箱的例子,这是正确的吗?那你怎么总结这个呢?
如上所述的装箱/拆箱转换中的值是否会变得相同?
非常简短:装箱意味着创建一个引用类型的新实例.如果你知道这一点,你就会明白一个实例不会因创建另一个实例而改变.
您正在使用的a = 2是不更改"框"中的值,您正在创建引用类型的新实例.那么为什么要改变其他什么呢?