我是否必须这样做以确保正确处理MemoryStream?
using (MemoryStream stream = new MemoryStream(bytes))
using (XmlReader reader = XmlReader.Create(stream))
{
return new XmlDocument().Load(reader);
}
或者是否可以内联MemoryStream以使其超出范围?喜欢这个?
using (XmlReader reader = XmlReader.Create(new MemoryStream(bytes)))
{
return new XmlDocument().Load(reader);
}
答案 0 :(得分:11)
作为一般规则,是的,你应该像第一个例子那样编写代码。
有些类接受传递给它的对象的所有权,因此当你处理外部对象时,它会自动为你处理内部对象,但这是规则的例外。
无论如何,多次调用Dispose
应该是安全的。也就是说,对象应该实现它,以便它是安全的,只在第一次完成工作。
因此,作为一般规则,请使用第一种语法。
现在,对于指定的示例,它应该不重要,因为MemoryStream
并不真正持有需要处理的任何资源,但是这个期望也存在问题。如果您知道对象的给定版本不使用资源,那么忽略Dispose
是安全的,那么如果将来该对象获得此类资源,您将突然获得泄漏。
除非您看到给定代码带来一些负面影响,比如增加太多开销,否则我根本不会担心。
答案 1 :(得分:10)
默认情况下,XmlReader没有(但请参阅Colin和dh的建议),假设它是唯一一个使用流的,所以第一个选项是唯一的Dispose安全选项。
答案 2 :(得分:4)
有一个选项可以使用XmlReaderSettings并将CloseInput设置为true,就像这样
var reader = XmlReader.Create(new MemoryStream(), new XmlReaderSettings {CloseInput = true});
答案 3 :(得分:3)
这实际上取决于XmlReader的Dispose()。需要做一些工作才能确切地弄清楚它的作用。我亲自编写第一个样本的代码。如果你有新的东西,那么你有责任处理它。你不应该指望别人为你照顾它(虽然他们可能)。
答案 4 :(得分:2)
你在谈论两件不同的事情:
MemoryStream.Dispose
实际上没有做任何事情。答案 5 :(得分:-1)
内存流实际上不需要调用Dispose()。然而,问题仍然有效,因为其他类型的流需要Dispose()。