写法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()没关系 ,是不是这样?
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()没关系 ,是不是这样?
using(Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
{}
IDispose接口
第二种会有GC回收
如果1不Close();那这个资源只有到程序关闭时才会被释放?
GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
居然没仔细看。汗,误人子弟了。
资源不是在程序关闭的时候,你要看看.net的垃圾回收策略。wince上会在垃圾内存达到某个量的时候进行释放,桌面上则将没有引用的内存放在一个回收队列中,等待回收。回收会分3个级别,分别回收资源,首先对这些对象,查看是否实现了IDispose接口,如果有,则调用,你的这个stream也在这个时候调用Dispose,stream的Dispose中,会调用stream的close方法。此时stream就关闭了。
1.GC,垃圾回收不是一个简单的过程,
2.如果只是从使用的角度就是,实现IDispose的就用using
3.如果有Close()的,推荐调用Close(),而不是调用IDispose()
4.其它的不用管,要相信GC
正好说反了。是Dispose调用Close,Dispose是IDispose接口定义的方法,Close才是真正的释放资源,系统垃圾回收机制只能找到Dispose方法,找不到Close的。Close只对资源释放,不做其他操作。