为什么我需要在stringreader和stringwriter上调用dispose?

时间:2016-10-07 20:50:21

标签: c# idisposable

首先是我阅读stackoverflow answer

StringWriter implments public abstract class TextWriter : MarshalByRefObject, IDisposable

MSDN上说:

  

Framework提供了应该是System.IDisposable的接口   实现为开发人员提供手动释放非托管的方法   资源一旦不需要,就立即生效。

什么被视为非托管资源?我显然不认为StringWriter符合条件。如果我自己编写而不继承IDisposable ....我不认为有必要添加Dispose()

class ConfusedDevStringWriter{
   private StringBuilder sb;
   public ConfusedDevStringWriter(){ //ctor
      sb = new StringBuilder();
   }
}

事实上,我使用visual studio内存调试器进行了测试: enter image description here 一旦函数返回,StringWriter及其StringBuilder被释放...... 此外,调用dispose似乎对StringWriter 无效......

enter image description here

因此,并非每个从IDisposable继承的类都有用Dispose。这再次回到我的问题什么被视为非托管资源(例子将非常感谢n_n)。我听说文件是其中之一......但是不是CLR一个VM?...每个资源都应该由它管理,非?

2 个答案:

答案 0 :(得分:1)

Option Explicit Sub test() Dim shp As Shape For Each shp In ActiveSheet.Shapes.Range(Array("MyShapeGroup")) shp.Fill.ForeColor.RGB = RGB(255, 255, 0) shp.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 255, 255) Next End Sub 来自实现StringWriter的{​​{1}},可能是因为大多数 TextWriter将拥有非托管资源。如果您收到IDisposable并且您不知道它来自哪里(即它可能是TextWriters的任何后代),则TextWriter实施TextWriter的事实允许您正确管理它拥有的任何非托管资源。您可以编写接受任何TextWriter的代码,在不再需要编写器时调用IDisposable,并相信所有内容都会被清理好。

答案 1 :(得分:0)

StringWriter继承自实现TextWriter的抽象IDisposable,并且有一些的子类具有非托管资源,如流,文件句柄等。因此,可以安全地处理TextWriter的任何子类,而不必担心是否有必要进行处置。

因此,处置StringWriter可能实际上任何事情(类似于DataSet),但处理任何实现{的事情仍然是一种好习惯{1}}。