如果它是IDisposible,我可以"内联"一个变量吗?

Col*_*lin 11 c# dispose idisposable

我是否必须这样做以确保正确处理MemoryStream?

  using (MemoryStream stream = new MemoryStream(bytes))
  using (XmlReader reader = XmlReader.Create(stream))
  {
    return new XmlDocument().Load(reader);
  }
Run Code Online (Sandbox Code Playgroud)

或者可以内联MemoryStream以使其超出范围?像这样?

  using (XmlReader reader = XmlReader.Create(new MemoryStream(bytes)))
  {
    return new XmlDocument().Load(reader);
  }
Run Code Online (Sandbox Code Playgroud)

ang*_*son 11

作为一般规则,是的,您应该像第一个示例中那样编写代码.

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

无论如何,Dispose不止一次打电话应该是安全的.也就是说,对象应该实现它,以便它是安全的,只在第一次完成工作.

因此,作为一般规则,请使用第一种语法.

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

除非你看到给定代码带来一些负面影响,比如增加太多开销,否则我根本就不用担心.

  • `IDisposable`与内存管理无关.这是关于_resource_ management.GC不会让您免于担心资源管理. (4认同)

Pon*_*gge 10

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