您的位置:首页 > 编程语言 > C#

关于c# 栈与堆的理解

2010-11-29 13:06 176 查看
最近在公司实习,主要业务是工业软件,用.net开发,说实话我之前一直用java的。c#都没怎么接触过,所以打算每天写点随笔,鉴证我的学习过程。

下面是我对栈与堆的理解(纯个人观点):

1.首先对于值类型是直接把变量的值保存在栈中的,而引用类型则把数据的地址保存在栈中,而实际数据则保存在堆中。

2.栈:在内存中存储的是固定长度的数据(如:int是4个字节)。堆:存储的是可变长度的数据(如string)。

3.在c#中还提到了托管堆,这其实是.net不同于其他语言的地方,它存储的是引用类型如类,对象并受垃圾收集器的控制和管理。

例:

1. class1 object1;

2. object1=new class1();

第一句定义了class1的引用,实质上就是在栈中分配了一个4个字节的空间,用来存储实例化后对象在托管堆中的地址。

第二句实例化object1对象,实质上就是在托管堆中开辟了内存空间来存储类class1的一个具体对象。由此可知,c#不让使用未实例化的对象是因为这

个对象在托管堆中还不存在。当对象不再使用,这个存在栈中的引用变量会被删除,但是托管堆中这个引用指向的对象还是存在的,其空间何时被释放

取决于垃圾收集器而不是引用变量失去作用域。

4.c#除了引用类型的变量,还存在值类型和其他托管堆不能管理的对象,如文件名柄,网络连接和数据库连接,这些变量的释放就需要通过析构函数或

IDisponse接口来做。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: