我会简单的。我有一个字符串编写器作为类成员因此我不能使用using()。每当我调用某个函数时,我想要一个空的sw。我应该在sw上调用Dispose()并分配一个新对象吗?或者我应该做类似.close()的事情并做其他事来清空缓冲区?
答案 0 :(得分:11)
我同意另一位回答者的意见,你应该看看你的设计,看看是否真的有了班级级别的作家。
但是,我不同意关于
的观点“它所做的就是回电话 基类'(TextWriter)Dispose - 什么也没做。“
当使用类时,如果类型实现Dispose
,你真的应该明确地或使用“使用”来调用它。
在这种情况下,StringWriter.Dispose
调用TextWriter.Dispose
确实无效,但我真的不会建议“只是忽略它”。
继承和多态的整个要点是这种类型可以换出派生类型。
代码中的今天StringWriter
可能会换成明天的EvenBetterStringWriter
,这可能会为Dispose
提供更有意义的实施。
如果它实现Dispose
,并且你使用它,你应该认真考虑在完成后调用dispose。
当你让它像这样指导你的设计时,拥有这个特定具体实现的内部特权是很危险的。 StringWriter
类的作者明确表示要调用Dispose,或者它不在那里。
答案 1 :(得分:5)
如果你的某个函数每次都需要一个空的StringWriter,为什么不在这个函数中创建一个新的StringWriter?
但是,回到原来的问题,我使用.NET Reflector来查看StringWriter的Dispose的作用。它所做的就是回调基类'(TextWriter)Dispose - 它什么都不做。
因此,如果您真的需要“重新使用”您正在暴露的StringWriter,那么在您需要时重新创建新实例似乎是安全的(尽管我认为您应该重新考虑您的设计将StringWriter暴露为类的公共成员。
答案 2 :(得分:1)
简而言之,来自O'reilly的C#:
但是,有三种情况不处理:
- ...
- ...
- 当设计中不需要对象的Dispose方法时,处理该对象会增加程序的复杂性
第三类包括以下类:WebClient, StringReader,String Writer和BackgroundWorker(in System.ComponentModel)。这些类型在一定程度上是一次性的 他们的基础而不是真正需要执行 必要的清理。如果你碰巧实例化并使用这样的 对象完全在一个方法中,将其包装在一个使用块中添加 有点不便。但如果物体持久,保持 跟踪它何时不再使用,以便您可以处理它添加 不必要的复杂在这种情况下,您可以简单地忽略对象 处置。
tl;博士:不,你不需要处置。