深 刻 讨 论 C# 里 对 象 和 内 存 的 关 系

KaKaKaKa 2009-10-28 02:48:32
请高手针对以下问题作一回答,我现在概念比较模糊:

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;后在内存中有什么区别呢?也是说堆和栈。

希望详细回答,谢谢!
...全文
185 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
S314324153 2010-03-26
  • 打赏
  • 举报
回复
这些基本概念还真的很少研究
tiandiyouwo1 2009-10-29
  • 打赏
  • 举报
回复
可以那样说,但内存不是连续分配的,所以有许多断断续续的内存碎片,加上这些碎片就差不多了
KaKaKaKa 2009-10-29
  • 打赏
  • 举报
回复
我们平时所说的:打开任务管理器,看一个程序占了多少内存
------------------------------------------
这里说的内存是什么意思? 堆和栈加起来所占空间的总合么? 这样理解对么?
辉太郎 2009-10-29
  • 打赏
  • 举报
回复
路过
KaKaKaKa 2009-10-29
  • 打赏
  • 举报
回复
我们平时所说的:打开任务管理器,看一个程序占了多少内存
------------------------------------------
这里说的内存是什么意思? 堆和栈加起来所占空间的总合么? 这样理解对么?
KaKaKaKa 2009-10-29
  • 打赏
  • 举报
回复
原来是这样。。
cacagege 2009-10-28
  • 打赏
  • 举报
回复
楼上讲的很清楚了。补充一下第3条
. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?

Form a;
因为它是一个在栈中创建的引用,所以,它的生命周期 应该跟包含这条语句的一对花括号有关,
出了花括号,就玩完了。。
zxforben111 2009-10-28
  • 打赏
  • 举报
回复
mark
KaKaKaKa 2009-10-28
  • 打赏
  • 举报
回复
自己顶一下,继续上面的问题:
我们平时所说的:打开任务管理器,看一个程序占了多少内存
------------------------------------------
这里说的内存是什么意思? 堆和栈加起来所占空间的总合么? 这样理解对么?
oasistree 2009-10-28
  • 打赏
  • 举报
回复
Mark too
xmsheji 2009-10-28
  • 打赏
  • 举报
回复
Mark
KaKaKaKa 2009-10-28
  • 打赏
  • 举报
回复
再问个: 我们平时所说的:打开任务管理器,看一个程序占了多少内存
------------------------------------------
这里说的内存是什么意思? 堆和栈加起来所占空间的总合么? 这样理解对么?
KaKaKaKa 2009-10-28
  • 打赏
  • 举报
回复
谢谢楼上各位,尤其CsToD和乔巴的回答,茅塞顿开的感觉。。
wu8862889 2009-10-28
  • 打赏
  • 举报
回复
乔巴,我喜欢!!!
帮楼主顶下
快乐乔巴 2009-10-28
  • 打赏
  • 举报
回复
回答第4个问题
CsToD兄已经说的很明白了~ 手脚真快!刚回贴已经是3楼了~..
ok了 不懂的可以再问~~
快乐乔巴 2009-10-28
  • 打赏
  • 举报
回复
回答问题3
3. 如果一个类中只写了 Form a; 却一直没用到这个a,是不是a在内存中一直占?
这里的确我也迷惑过,要记住!
声明定义同存储无关,不要去套在一起
和存储有关的只是形成对象的时候,也就是new的时候 !!
快乐乔巴 2009-10-28
  • 打赏
  • 举报
回复
回答第二个问题
2. 问题1里的int如果换成Form,即写Form a;跟写Form a=new Form()以及写Form a=null;有什么区别?(就堆和栈分别讨论)
首先我们要搞清楚From是什么,他是个引用类型。
声明定义同存储无关,不要去套在一起
和存储有关的只是形成对象的时候,也就是new的时候
Form a = new Form()

记住一句话黄金规则引用类型总是放在堆中。
这个时候会在a将被放置在堆上,同时在栈上生成一个指向这个堆的指针引用。
也就是堆和栈都有影响
Form a=null;

这句话会将指向这个堆的指针引用给删除了,那也就是栈中声明没了,但是a这个实例还在堆中
在这种情况下,它会成为垃圾回收器的回收对象。
Aslangg 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flyerwing 的回复:]
围观大虾
[/Quote]
快乐乔巴 2009-10-28
  • 打赏
  • 举报
回复
先回答第一个问题
1. 只写int a; 跟写int a=1; 在内存上有什么区别?(就堆和栈分别讨论)
int a;
这个只是个定义,因为a是值类型,所以先入栈。没有堆的操作
int a=1;

这一句其实可以这么写
//实例
int a = new Int();
//C#的简写
int a=1;

两者的效果是一样的 从上面的代码我们可以知道a是一个实例 而且还是个值类型
所以会在栈中分配空间,并设值为1。因为是值类型所以没有堆的操作。
flyerwing 2009-10-28
  • 打赏
  • 举报
回复
围观大虾
加载更多回复(2)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧