【发布时间】:2017-11-26 16:02:48
【问题描述】:
昨天,在我们的代码库上运行 Visual Studio 代码分析后,以下代码被突出显示为问题:
using (var stringReader = new StringReader(someString))
{
using (var reader = XmlReader.Create(stringReader)) {
// Code
}
}
返回的警告是
警告 CA2202 对象“stringReader”可以在 方法'(方法名称)'。为了避免产生 System.ObjectDisposedException 你不应该调用 Dispose 超过 一次在一个物体上。
在搜索堆栈溢出后,我得出一个普遍的认识,如果我要创建一个包含 IDisposable 成员的自定义类,它应该自己实现 IDisposable,并调用该成员的dispose() 方法。
我的两个问题是
- 在对象 X 在创建期间将引用
IDisposable对象 Y 作为参数的所有情况下,假设对象 X 将获得 Y 的所有权是否正确,从那时起,调用X.dispose()将总是导致调用Y.dispose() - 这是一段旧代码,从未报告过警告消息中描述的异常(据我所知)。如果假设以上几点,为什么双
using块不会导致调用stringReader.dispose()两次并因此引发异常?
【问题讨论】:
-
您应该期待的是,封闭类型的实现者已记录它与您交给它的一次性用品有关的行为。
标签: c# idisposable