.net关于资源释放问题

yongfa365 2010-06-07 10:17:04
写法1:
Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();

写法2:
request.GetRequestStream().Write(data, 0, data.Length);

问题:
这两种写法是不是一样的,
第一种写法把流写到了 stream所以要释放,
第二种写法没写到流,没法释放资源,也不用释放


是不是这样?

stream.Close()是释放stream跟request.GetRequestStream()没关系 ,是不是这样?
...全文
150 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuai13869896140 2010-06-08
  • 打赏
  • 举报
回复
同时谢谢LZ给了一个学习的机会```
兔子-顾问 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cc_net 的回复:]
有好多对象close内部就是调用Dispose

建议看下.NET框架设计里面介绍的垃圾回收
[/Quote]

正好说反了。是Dispose调用Close,Dispose是IDispose接口定义的方法,Close才是真正的释放资源,系统垃圾回收机制只能找到Dispose方法,找不到Close的。Close只对资源释放,不做其他操作。
cc_net 2010-06-08
  • 打赏
  • 举报
回复
有好多对象close内部就是调用Dispose

建议看下.NET框架设计里面介绍的垃圾回收
yongfa365 2010-06-08
  • 打赏
  • 举报
回复
分析结果:
1.GC,垃圾回收不是一个简单的过程,
2.如果只是从使用的角度就是,实现IDispose的就用using
3.如果有Close()的,推荐调用Close(),而不是调用IDispose()
4.其它的不用管,要相信GC
porschev 2010-06-08
  • 打赏
  • 举报
回复
看看。。。。。。。。。。
兔子-顾问 2010-06-08
  • 打赏
  • 举报
回复
所以,不是程序关闭的时候,而是下一次垃圾回收的时候。
兔子-顾问 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yongfa365 的回复:]
那是不是同理可证:
如果1不Close();那这个资源只有到程序关闭时才会被释放?
[/Quote]

居然没仔细看。汗,误人子弟了。
资源不是在程序关闭的时候,你要看看.net的垃圾回收策略。wince上会在垃圾内存达到某个量的时候进行释放,桌面上则将没有引用的内存放在一个回收队列中,等待回收。回收会分3个级别,分别回收资源,首先对这些对象,查看是否实现了IDispose接口,如果有,则调用,你的这个stream也在这个时候调用Dispose,stream的Dispose中,会调用stream的close方法。此时stream就关闭了。
danyaozhuanjia 2010-06-08
  • 打赏
  • 举报
回复
关于资源释放的问题,参考c#的GC
yongfa365 2010-06-07
  • 打赏
  • 举报
回复
基本上想明白了,明天结贴,谢谢各位

我再看看Close(),Dispose(),和内存释放关系
「已注销」 2010-06-07
  • 打赏
  • 举报
回复
Close()方法不是释放资源用的,他只是说明输出流完了,如果像第二种情况不写的话,他在一次请求处理完时自动关闭,说明结束

资源是等到GC想起来的时候才会回收,跟Close()方法没直接关系

(注:个人见解)
皇城龙三 2010-06-07
  • 打赏
  • 举报
回复
转wuyq11的帖子:
GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
皇城龙三 2010-06-07
  • 打赏
  • 举报
回复
GC会定时或当系统内存不够的时候回收资源,这些被回收的资源是通过系统内部的一个hash表无法访问到的资源
兔子-顾问 2010-06-07
  • 打赏
  • 举报
回复
是的。
yongfa365 2010-06-07
  • 打赏
  • 举报
回复
那是不是同理可证:
如果1不Close();那这个资源只有到程序关闭时才会被释放?
wuyq11 2010-06-07
  • 打赏
  • 举报
回复
using(Stream stream = request.GetRequestStream())
{}
IDispose接口
第二种会有GC回收
兔子-顾问 2010-06-07
  • 打赏
  • 举报
回复
第二种会按照.net垃圾回收策略,在下一次对1带垃圾回收的时候,对你的这个stream执行Dispose,进而会调用close方法。前者手工关闭,会好一些,推荐写法是这样的:
using(Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}

110,536

社区成员

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

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

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