我必须这样做以确保正确处理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);
}
XmlReader默认情况下不(但请参阅Colin和dh的建议)假定它是使用流的唯一方法,因此第一个选择是唯一的Dispose安全方法。
通常,是的,您应该像第一个示例中那样编写代码。
[有些类拥有传递给它的对象的所有权,因此当您处理外部对象时,它会自动为您处理内部对象,但这是规则的例外。
无论如何,多次调用Dispose
应该是安全的。也就是说,对象应该实现这一点以使其安全,仅在第一时间进行工作。
因此,一般来说,请采用第一种语法。
现在,对于指定的示例,这并不重要,因为MemoryStream
并没有真正保留任何需要处理的资源,但是这种期望也存在问题。如果您知道某个对象的给定版本不使用资源,那么可以忽略Dispose
,这是安全的,那么如果将来该对象获得了这种资源,则会突然泄漏。
除非您看到给定代码带来的不利影响,例如增加过多的开销,否则我完全不必担心。
有一个使用XmlReaderSettings的选项,像这样将CloseInput设置为true
var reader = XmlReader.Create(new MemoryStream(), new XmlReaderSettings {CloseInput = true});
这实际上取决于XmlReader的Dispose()。需要做一些工作才能弄清楚它到底在做什么。我个人像第一个示例一样编写代码。如果您有新东西,那么处置它是您的责任。您不应期望别人为您照顾它(尽管他们可能会这样做)。
您正在谈论两件事:
MemoryStream.Dispose
实际上没有执行任何操作]之外没有其他原因。内存流实际上不需要调用Dispose()。但是,由于其他类型的流需要Dispose(),因此该问题通常还是有效的。