c#中值类型和引用类型的内存分配

时间:2015-07-13 20:27:45

标签: c# memory

基于下面的代码,我在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 分配给堆或堆栈。

1 个答案:

答案 0 :(得分:1)

对象是否在堆栈或堆上分配是一个实现细节,完全可以创建一个完全无效的C#实现,根本不使用基于堆栈的分配。

也就是说,它将被分配在.net框架的堆上,而不是堆栈上,因为它是一个引用类型:对象是在堆上创建的,引用很可能保存在堆栈上。

如果它是一个结构,那么结构布局可能位于堆栈上,但其中的任何引用类型都是对堆上对象的引用。所以,即使这是一个结构,字符串也会存在于堆上,而整数可能会在堆栈上。

注意:这些都是实现细节,从不将它们视为一成不变:.net的未来实现,或C#的替代实现可以随意更改这些细节。

相关问题