我最近遇到的另一个 C# 面试问题是我是否知道装箱和拆箱是什么。
我解释过值类型位于堆栈上,引用类型位于堆上。
当一个值被转换为引用类型时,我们称之为装箱,反之亦然。
然后他让我计算一下:
int i = 20;
object j = i;
j = 50;
What is 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;
What is t2.x
?应该是3,确实如此。但这根本不是装箱/拆箱的示例,这是正确的吗?那么你会如何总结这一点呢?
在装箱/拆箱转换中,这些值是否会变得与上述相同?
很短:拳击的意思创建引用类型的新实例。如果您知道这一点,您就会明白创建另一个实例不会改变一个实例。
你正在做什么a = 2
没有更改“框中”中的值,您正在创建引用类型的新实例。那么为什么还要改变其他事情呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)