请高手针对以下问题作一回答,我现在概念比较模糊:1. 只写int a; 跟写int a=1; 在内存上有什么区别?(就堆和栈分别讨论)2. 问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论)3. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?4. 对于Form a=new Form(); a.Close();和a.Dispose(),以及a=null;后在内存中有什么区别呢?也是说堆和栈。希望详细回答,谢谢!
解决方案 »
- 化悲痛为力量 我选择学习!求助基础问题
- 询问在线程中使用drawstring问题
- 每隔几秒钟检查一次服务器在不在线,发送数据包时当服务器不在线时,会出现死机的情况
- ASP.NET如何在页面见传递ID参数实现详细页的访问?
- 求Visual Studio 2005 Beta 1 Refresh 的下载....
- FileStream怎么在写文件时插入一个回车键呢?
- DataTable的Select方法严重问题,望高手帮帮忙!
- 如何读取excel表中多头列的数
- 现有web站点如何能让手机有更好的访问体验(web和wap访问能否共用一个后台)
- |||||||||| 我是人吗?||||||||||||||||
- 编码题
- ajax调用用户控件时,用户控件无法执行后台代码,如何解决?(加分贴)
int a=1是不仅定义一个a 而且为他赋值为1
Form a=new Form()是实例化一个对象
Form a=null是定义一个对象为空
只写了 Form a 会占内存 但是C#有自动垃圾回收
a.Close();是关闭
a.Dispose()是释放所有的资源
Form a;//说过了
new Form();//在堆上分配一个Form对象并返回其内存地址
Form a=new Form();//将new产生的内存地址赋值给a,从而使a指向改内存3. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?
是不是用,跟占不占内存无关,只要在作用域和生命期,就会占内存。不过前面告诉你了,只有new操作才真正分配内存,单独一个Form a;只是在栈上分配了一个4字节的指针4. 对于Form a=new Form(); a.Close();和a.Dispose(),以及a=null;后在内存中有什么区别呢?也是说堆和栈。
Close和Dispose的区别自己在.net的源码,不过我可以告诉你,Close方法在绝大多数情况是直接调用Dispose方法,也就是说没有任何区别。
a=null;让a不指向任何内存Close和Dispose方法释放内存了,a=null没有做有用的操作,但垃圾收集器会在适当的时候回收a原来指向的内存(因为a不再执行它,那块内存就可以被GC回收了)
1. 只写int a; 跟写int a=1; 在内存上有什么区别?(就堆和栈分别讨论)
int a;这个只是个定义,因为a是值类型,所以先入栈。没有堆的操作
int a=1;
这一句其实可以这么写
//实例
int a = new Int();
//C#的简写
int a=1;
两者的效果是一样的 从上面的代码我们可以知道a是一个实例 而且还是个值类型
所以会在栈中分配空间,并设值为1。因为是值类型所以没有堆的操作。
2. 问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论)
首先我们要搞清楚From是什么,他是个引用类型。
声明定义同存储无关,不要去套在一起
和存储有关的只是形成对象的时候,也就是new的时候
Form a = new Form()
记住一句话黄金规则引用类型总是放在堆中。
这个时候会在a将被放置在堆上,同时在栈上生成一个指向这个堆的指针引用。
也就是堆和栈都有影响
Form a=null;
这句话会将指向这个堆的指针引用给删除了,那也就是栈中声明没了,但是a这个实例还在堆中
在这种情况下,它会成为垃圾回收器的回收对象。
3. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?
这里的确我也迷惑过,要记住!
声明定义同存储无关,不要去套在一起
和存储有关的只是形成对象的时候,也就是new的时候 !!
CsToD兄已经说的很明白了~ 手脚真快!刚回贴已经是3楼了~..
ok了 不懂的可以再问~~
. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占? Form a;
因为它是一个在栈中创建的引用,所以,它的生命周期 应该跟包含这条语句的一对花括号有关,
出了花括号,就玩完了。。