关于C#当中栈(stack)和堆(heap)的问题

class A
{
int a = 12
}
class B
{
static void Main(string[] args)
{
A C1 = new A();
A C2 = new A();
Console.WriteLine("C1.a");
C2.a=6
Console.WriteLine("C2.a");
}

}
如这个例子,c1和c2 是否是在堆中开辟一个小的内存空间,然后引用了同为堆上的a=12,对吗? 然后c2.a=6就是重新在堆上面声明了一个a=6的内存空间,是否可以这样理解?

第一个问题:对的。但注意 c1,c2分配的内存是完全独立的,所以c1里面的a和c2里面的a的内存地址是不一样的。
第二个问题:不对。c2.a 这个a的内存是在new的时候已经分配好的,a=6仅仅是改变内存的内容而已,不是重新开辟内存。追问

谢谢回答,那我还想问下,大部分的(函数)方法使用,是不是等于引用类型,其实就是方法在栈中运行的时候,其中的值是从堆里面引用的,然后方法使用完成,自动删除,但是引用的值还是存在在堆中的。

追答

饿。。

    方法里面的引用类型变量,其内存是引用在堆上的,但是值类型变量,是分配在内存上面的。方法里面值类型变量跟类成员的值类型成员,其内存分配地址是不同的。

    关于内存回收,.net有GC来管理内存回收,所以方法结束后,对于我们来说,我们不知道内存是在什么时候被回收的。“但是引用的值还是存在在堆中的”,这个是无法确定的。至于你说的“自动删除”不理解是删除什么。

追问

哦我说的是栈的删除方法,是不是先放后进,到栈顶自动删除呢。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答