写法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()没关系 ,是不是这样?

解决方案 »

  1.   

    第二种会按照.net垃圾回收策略,在下一次对1带垃圾回收的时候,对你的这个stream执行Dispose,进而会调用close方法。前者手工关闭,会好一些,推荐写法是这样的:
    using(Stream stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
      

  2.   

    using(Stream stream = request.GetRequestStream())
    {}
    IDispose接口
    第二种会有GC回收
      

  3.   

    那是不是同理可证:
    如果1不Close();那这个资源只有到程序关闭时才会被释放?
      

  4.   

    GC会定时或当系统内存不够的时候回收资源,这些被回收的资源是通过系统内部的一个hash表无法访问到的资源
      

  5.   

    转wuyq11的帖子:
    GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
    托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
    在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
      

  6.   

    Close()方法不是释放资源用的,他只是说明输出流完了,如果像第二种情况不写的话,他在一次请求处理完时自动关闭,说明结束资源是等到GC想起来的时候才会回收,跟Close()方法没直接关系(注:个人见解)
      

  7.   

    基本上想明白了,明天结贴,谢谢各位我再看看Close(),Dispose(),和内存释放关系
      

  8.   

    关于资源释放的问题,参考c#的GC
      

  9.   


    居然没仔细看。汗,误人子弟了。
    资源不是在程序关闭的时候,你要看看.net的垃圾回收策略。wince上会在垃圾内存达到某个量的时候进行释放,桌面上则将没有引用的内存放在一个回收队列中,等待回收。回收会分3个级别,分别回收资源,首先对这些对象,查看是否实现了IDispose接口,如果有,则调用,你的这个stream也在这个时候调用Dispose,stream的Dispose中,会调用stream的close方法。此时stream就关闭了。
      

  10.   

    分析结果:
    1.GC,垃圾回收不是一个简单的过程,
    2.如果只是从使用的角度就是,实现IDispose的就用using
    3.如果有Close()的,推荐调用Close(),而不是调用IDispose()
    4.其它的不用管,要相信GC
      

  11.   

    有好多对象close内部就是调用Dispose建议看下.NET框架设计里面介绍的垃圾回收
      

  12.   


    正好说反了。是Dispose调用Close,Dispose是IDispose接口定义的方法,Close才是真正的释放资源,系统垃圾回收机制只能找到Dispose方法,找不到Close的。Close只对资源释放,不做其他操作。