使用关键字和托管\ UnManaged代码

C#关键字使用实现Idisposable它提供了释放非托管资源的机制。

现在我正在浏览这个代码

string txt = String.Empty;
      using (StreamReader sr = new StreamReader(filename)) {
         txt = sr.ReadToEnd();
      }

并不能停止想知道,为什么在这段代码中使用关键字Using ,而StreamReader是一个托管资源,它的作用域是垃圾收集器在其作用域结束后释放对象内存的责任。

所以我的问题是,

  • 上面的代码只是一个明确的处理方式来释放资源
  • 根据我的理解,我们在.net框架下使用的任何方法或类都是托管代码,那么StreamReader也不属于托管代码。
  • 我在Managed Unmanaged代码上丢失了什么

  • 为什么在此代码中使用关键字Using,而StreamReader是托管资源

    虽然StreamReader是一个托管对象,但它可能会在托管堆中存放未分配的对象。 垃圾收集器无法识别其分配,因此无法清理它们。 对于StreamReader的特殊情况,它在内部创建一个FileStream (针对您的特定情况),它在内部创建并保存WIN32文件句柄。

    _handle = Win32Native.SafeCreateFile(tempPath, fAccess, share, secAttrs, mode, flagsAndAttributes, IntPtr.Zero);
    

    (代码参考)

    using只是简写:

    try
    {
       var streamReader = new StreamReader(path);
       // code
    } 
    finally
    {
      streamReader.Dispose();
    }
    

    实现IDisposable方法需要实现Dispose ,以便他们有机会关闭文件句柄,套接字或任何可能需要手动清理的资源。

    如果有人在类中持有StreamReader那么该类也应实现IDisposable ,以便将Dispose正确传递给StreamReader

    因此,可以将IDisposable视为一个的合约 IDisposable可以保存本机对象,也可以保存实现IDisposable的对象


    我认为这更像是一种防御性编码风格,我不希望使用流读取器对象,因为与此对象关联的文件已使用ReadtoEnd函数完全读取,并且正在被txt引用。

    链接地址: http://www.djcxy.com/p/54509.html

    上一篇: Using keyword and Managed\UnManaged code

    下一篇: Should classed that use huge amounts of memory impmlement System.IDisposable