昨天,在我们的代码库上运行 Visual Studio 代码分析后,以下代码被标记为问题:
返回结果:
using (var stringReader = new StringReader(someString))
{
using (var reader = XmlReader.Create(stringReader)) {
// Code
}
}
返回结果:
返回的警告信息如下:
警告 CA2202:“(方法名)”中的对象“stringReader”可以被多次处理。为了避免生成 System.ObjectDisposedException,您不应在一个对象上调用 Dispose 大于一次。
在搜索 stack overflow 后,我总结出了一个普遍的理解:如果我创建了一个包含 IDisposable 成员的自定义类,则该类本身应该实现 IDisposable,并调用成员的 dispose() 方法。
我的两个问题是:
- 在所有情况下,当对象 X 以参数形式接收可处理对象 Y 的引用来创建时,是否正确假设对象 X 将拥有 Y,并从那时起,调用 X.dispose() 将始终导致调用 Y.dispose()?
- 这是一段旧代码,并且从未报告过和警告信息描述相同的异常(据我所知)。如果假定上述点,为什么双重 using 块不会导致调用 stringReader.dispose() 两次,从而抛出异常呢?