【发布时间】:2022-01-13 20:00:15
【问题描述】:
我有点困惑,如果我创建一个类 Test 的实例,这意味着在堆栈中创建对存储字段 a 的堆的引用。
class Test
{
public int a;
}
Test test = new Test();
test.a = 10;
我在这里创建 o,所以这意味着在堆栈中创建对存储值 10 的堆的引用。据我所知,在这两种情况下,我们在堆中都有相同的变量二进制表示。
object o = 10;
为什么在第二种情况下我会拳击但在第一种情况下没有拳击?
【问题讨论】:
-
好吧,
a是int类型,而您正在为其设置int,所以将int设置为int,那么为什么需要拳击呢?而在其他代码上,您将int设置为object,所以有两种不同的类型。 -
装箱意味着采用一个值类型,它存在于存储该变量的任何位置的变量中,而不是将其存储在堆上。这是在堆上为值类型分配内存并将值复制到那里的行为。在第一个示例中,您在做同样的事情,您正在为包含 int 字段的对象分配空间。但是将值存储到该字段中不需要装箱,因为 int 变量已经位于堆上。因此,您不需要为该对象中的 int 分配单独的内存。
-
堆中的内容会有所不同,因为该类将包含其他信息,而装箱的
int将只是int的值。 -
@juharr 不太确定。该框与
Test本质上是一样的:一个类型句柄+字段 -
或者您可能想通过将
a设为测试类中的对象来提供一个更有趣的示例
标签: c#