基于下面的代码,我在c#
中的值类型和引用类型的情况下被问到了内存管理的问题public class X
{
int i=0;
string s= string.empty;
}
class test
{
static void Main()
{
X obj = new X(); //creating instance of X class
}
}
基于上面的代码,访问者问我在类测试中创建类X的实例时,那么在声明的字段 [integer i和string s] 会发生什么 就内存而言,类X是否将字段整数 i 分配给堆或堆栈。
答案 0 :(得分:1)
对象是否在堆栈或堆上分配是一个实现细节,完全可以创建一个完全无效的C#实现,根本不使用基于堆栈的分配。
也就是说,它将被分配在.net框架的堆上,而不是堆栈上,因为它是一个引用类型:对象是在堆上创建的,引用很可能保存在堆栈上。
如果它是一个结构,那么结构布局可能位于堆栈上,但其中的任何引用类型都是对堆上对象的引用。所以,即使这是一个结构,字符串也会存在于堆上,而整数可能会在堆栈上。
注意:这些都是实现细节,从不将它们视为一成不变:.net的未来实现,或C#的替代实现可以随意更改这些细节。