昨天,在我们的代码库上运行Visual Studio代码分析后,以下代码突出显示为问题:

using (var stringReader = new StringReader(someString))
{
    using (var reader = XmlReader.Create(stringReader)) {
    // Code
    }
}

返回的警告是



搜索堆栈溢出后,我得到了大致的了解,如果我要创建一个包含IDisposable成员的自定义类,则它应该实现IDisposable本身,并调用该成员的dispose()方法。

我的两个问题是
  • 在创建过程中对象X将对IDisposable对象Y的引用作为参数的所有情况下,假设对象X拥有Y的所有权并从该点开始,调用X.dispose()总是会导致调用是正确的Y.dispose()
  • 这是一段旧代码,警告消息中描述的异常从未报告过(据我所知)。如果假设以上几点,为什么双using块不会导致两次调用stringReader.dispose()并因此引发异常?
  • 最佳答案



    不,要假设这一点永远是不可行的。让我们检查一下这种特定情况:XmlReader.Create(Stream)

    在引用资源中找到相当多的代码后,我发现Dispose方法调用了Close方法。那是很明显的。然后注意this piece of code:

    public override void Close() {
        Close( closeInput );
    }
    

    因此,是否将关闭并丢弃备用流取决于设置closeInput的值,您可以通过 XmlReaderSettings.CloseInput 设置进行设置。

    因此,这里的答案是肯定的否定:您无法确定它是否已被处置。您应该始终确保自己是。

    关于c# - 将IDisposable传递到父级IDisposable时,结果是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44715247/

    10-12 03:10