c# - 装箱与拆箱

标签 c# boxing unboxing

我最近遇到的另一个 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/

相关文章:

c# - Windows7 上语音识别 C# WPF 应用程序的两个问题

Java - 装箱整数 - 为什么它返回 true 如果应该返回 false

java - java中的short和char自动拆箱

指向原始值的 Java 包装类引用

java - 调用方法时进行装箱

java - 拆箱 - 与单独拆箱相比,它如何成为显式使用 intValue() 的更好方法

c# - 使用通用集合装箱和拆箱

c# - LINQ 查询的返回类型是什么?

c# - 为什么我在使用带有安全 URL 的 HttpResponseMessage 时得到 401 未经授权?

c# - 如何正确封装对具有(几乎)相同模式的不同数据库系统的访问?