2016-10-07 96 views
0

它从我开始读一stackoverflow answer为什么我需要在stringreader和stringwriter上调用dispose?

StringWriter implments上MSDNpublic abstract class TextWriter : MarshalByRefObject, IDisposable

它说:

该框架提供了应 实施提供开发人员手动System.IDisposable接口一旦不需要,可以立即释放非托管 资源。

但是什么被视为非托管资源?我显然不认为StringWriter符合资格。如果我写我自己没有继承IDisposable的....我看不出有任何需要补充Dispose()

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

事实上我与Visual Studio调试器的内存测试: enter image description here 一次函数返回时,StringWriterStringBuilder被释放...... Moreoever,调用Dispose似乎为StringWriter的什么也不做......

enter image description here

所以不是每一个说和poorly类从IDisposable rit有用Dispose。这又回到我的问题什么被视为非托管资源(例子将非常感谢n_n)。我听说文件是其中的一个......但不是CLR的虚拟机?......每个资源都应该由它来管理,不是?从抽象TextWriter,它实现IDisposable,并具有一定的子类有像流,文件句柄等,所以可以安全地处理TextWriter任何子类的非托管资源,而无需担心

+3

你的问题“*什么被视为非托管资源*”已经有了答案:http://stackoverflow.com/questions/3433197/what-exactly-are-unmanaged-resources – user3185569

+1

问题在标题中回答或多或少HTTP ://Stackoverflow.com/questions/234059/is-a-memory-leak-created-if-a-memorystream-in-net-is-not-closed(关于MemoryStream的Q也一样)。 –

+0

我把它作为http://stackoverflow.com/questions/2475228的一个副本关闭,它和http://stackoverflow.com/questions/3433197可以解答这两个问题。 –

回答

0

StringWriter继承如果处置是必要的或不。

所以设置一StringWriter可能实际上没有任何(类似DataSet),但它仍然是处置任何实现IDisposable很好的做法。

+1

我不同意。调用不执行任何操作的代码并不是一个好习惯。这实际上是不好的做法。编程语言有助于“处理”;不等或者什么都不做。 – Darkonekt

1

StringWriterTextWriter下降,它实现IDisposable,可能是因为TextWriters将有非托管资源。如果您收到TextWriter并且您不知道它来自哪里(即它可能是TextWriter的任何后裔),那么TextWriter实施IDisposable的事实允许您正确管理它拥有的任何非托管资源。您可以编写接受任何TextWriter的代码,在不再需要作者时调用Dispose,并相信所有内容都会清理干净。

相关问题