我知道所有像 int 这样的原始类型都是值类型,并且是在堆栈上创建的,而字符串、对象数组等是引用类型并且是在堆上创建的。
我的疑问如下。如果我创建一个整数对象,例如 int i = new int(); 那么既然它是一个对象,它会在堆栈或堆上创建吗?
简短的回答:实施细节。
长答案:实施细节 - 完全实施。
它可以在任何一个上创建.. 取决于它是如何创建的。它是一个类的成员吗?是局部变量吗?..
Eric Lippert 说你不应该真正关心它。在这里阅读。
Int 是一种值类型,几乎总是在堆栈中创建。
当整数是您实例化的类中的变量时,它不会在堆栈中创建:在这种情况下,实例位于堆及其所有成员中,包括值类型。
当然,我上面提供的链接比我解释得更好
过去我通常推翻这个神话的方式是说真正的陈述应该是“在桌面 CLR 上的 Microsoft 实现中,当值是局部变量或值时,值类型存储在堆栈中或不是 lambda 或匿名方法的封闭局部变量的临时变量,并且方法主体不是迭代器块,并且抖动选择不注册该值。”
int i = new int();
相当于int i = 0;
,所以不,它对堆栈/堆分配没有影响。
请注意,值类型并不总是在堆栈上创建,请参阅这个精美的博客条目以获取详细讨论: