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

问题描述 投票:11回答:6

我必须这样做以确保正确处理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);
  }
c# dispose idisposable
6个回答
10
投票

XmlReader默认情况下不(但请参阅Colin和dh的建议)假定它是使用流的唯一方法,因此第一个选择是唯一的Dispose安全方法。


11
投票

通常,是的,您应该像第一个示例中那样编写代码。

[有些类拥有传递给它的对象的所有权,因此当您处理外部对象时,它会自动为您处理内部对象,但这是规则的例外。

无论如何,多次调用Dispose应该是安全的。也就是说,对象应该实现这一点以使其安全,仅在第一时间进行工作。

因此,一般来说,请采用第一种语法。

现在,对于指定的示例,这并不重要,因为MemoryStream并没有真正保留任何需要处理的资源,但是这种期望也存在问题。如果您知道某个对象的给定版本不使用资源,那么可以忽略Dispose,这是安全的,那么如果将来该对象获得了这种资源,则会突然泄漏。

除非您看到给定代码带来的不利影响,例如增加过多的开销,否则我完全不必担心。


4
投票

有一个使用XmlReaderSettings的选项,像这样将CloseInput设置为true

var reader = XmlReader.Create(new MemoryStream(), new XmlReaderSettings {CloseInput = true});

这里:XmlReaderSettings.CloseInput Property


3
投票

这实际上取决于XmlReader的Dispose()。需要做一些工作才能弄清楚它到底在做什么。我个人像第一个示例一样编写代码。如果您有新东西,那么处置它是您的责任。您不应期望别人为您照顾它(尽管他们可能会这样做)。


2
投票

您正在谈论两件事:

  1. [从最佳实践的设计角度来看,您应该始终处置您负责的对象吗?
  2. 您将按照第二个示例中显示的模式经历内存泄漏吗? ,如果除了MemoryStream.Dispose实际上没有执行任何操作]之外没有其他原因。

-1
投票

内存流实际上不需要调用Dispose()。但是,由于其他类型的流需要Dispose(),因此该问题通常还是有效的。

© www.soinside.com 2019 - 2024. All rights reserved.