昨天,在我们的代码库上运行Visual Studio代码分析后,以下代码突出显示为问题:
using (var stringReader = new StringReader(someString))
{
using (var reader = XmlReader.Create(stringReader)) {
// Code
}
}
返回的警告是
搜索堆栈溢出后,我得到了大致的了解,如果我要创建一个包含IDisposable成员的自定义类,则它应该实现IDisposable本身,并调用该成员的
dispose()
方法。我的两个问题是
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/