关于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接口来做。
下面是我对栈与堆的理解(纯个人观点):
1.首先对于值类型是直接把变量的值保存在栈中的,而引用类型则把数据的地址保存在栈中,而实际数据则保存在堆中。
2.栈:在内存中存储的是固定长度的数据(如:int是4个字节)。堆:存储的是可变长度的数据(如string)。
3.在c#中还提到了托管堆,这其实是.net不同于其他语言的地方,它存储的是引用类型如类,对象并受垃圾收集器的控制和管理。
例:
1. class1 object1;
2. object1=new class1();
第一句定义了class1的引用,实质上就是在栈中分配了一个4个字节的空间,用来存储实例化后对象在托管堆中的地址。
第二句实例化object1对象,实质上就是在托管堆中开辟了内存空间来存储类class1的一个具体对象。由此可知,c#不让使用未实例化的对象是因为这
个对象在托管堆中还不存在。当对象不再使用,这个存在栈中的引用变量会被删除,但是托管堆中这个引用指向的对象还是存在的,其空间何时被释放
取决于垃圾收集器而不是引用变量失去作用域。
4.c#除了引用类型的变量,还存在值类型和其他托管堆不能管理的对象,如文件名柄,网络连接和数据库连接,这些变量的释放就需要通过析构函数或
IDisponse接口来做。
相关文章推荐
- 关于C#中Thread.Join()的一点理解
- C#中有关于:按 值 和 引用 传递参数 的理解
- 关于c#中static的一些理解
- 关于C#中派生类调用基类构造函数的理解[转]
- 关于C#对象引用疑惑的理解
- 关于C#.Net中事件(event)、委托(delegate)和方法的一点理解
- C# 关于Thread.join()的理解
- 我关于c#中委托的简单理解
- 关于C#中Thread.Join()的一点理解
- 关于C# 委托的理解
- C#关于数组的理解
- 关于C#数据类型自己的理解
- C# 关于 const、readonly 以及 class、struct理解
- 关于C#中委托的通俗理解
- 关于C#中派生类调用基类构造函数的理解
- 关于C#托管代码与非托管代码的理解
- 关于C#中委托的一些理解与模仿
- 关于C#调用API的理解(汇多考勤机HD4K)
- 关于C#中Thread.Join()的一点理解
- 关于c#中”ref”和”out”关键字的一些理解