首先是我阅读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内存调试器进行了测试:
一旦函数返回,StringWriter
及其StringBuilder
被释放...... 此外,调用dispose似乎对StringWriter 无效......
因此,并非每个从IDisposable
继承的类都有用Dispose
。这再次回到我的问题什么被视为非托管资源(例子将非常感谢n_n)。我听说文件是其中之一......但是不是CLR一个VM?...每个资源都应该由它管理,非?
答案 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}}。