如果变量是IDisisable,我可以“内联”变量吗?

时间:2010-02-11 15:22:21

标签: c# dispose idisposable

我是否必须这样做以确保正确处理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);
  }

6 个答案:

答案 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});

此处:XmlReaderSettings.CloseInput Property

答案 3 :(得分:3)

这实际上取决于XmlReader的Dispose()。需要做一些工作才能确切地弄清楚它的作用。我亲自编写第一个样本的代码。如果你有新的东西,那么你有责任处理它。你不应该指望别人为你照顾它(虽然他们可能)。

答案 4 :(得分:2)

你在谈论两件不同的事情:

  1. 从设计的最佳实践角度来看,您是否应该始终处置您负责的对象?的
  2. 您是否会在第二个示例中显示的模式后遇到内存泄漏? ,如果没有其他原因,MemoryStream.Dispose实际上没有做任何事情

答案 5 :(得分:-1)

内存流实际上不需要调用Dispose()。然而,问题仍然有效,因为其他类型的流需要Dispose()。