【发布时间】:2010-12-11 09:44:46
【问题描述】:
直觉上我认为是的,但我不确定是否有一些我不知道的约定。
【问题讨论】:
标签: c# exception dispose idisposable ienumerator
直觉上我认为是的,但我不确定是否有一些我不知道的约定。
【问题讨论】:
标签: c# exception dispose idisposable ienumerator
由于我们不知道具体实现是什么,唯一安全的答案是“是”。
然而,直接使用IEnumerator 是非常罕见的——foreach 更常见。对于通用 IEnumerator<T>,您可以使用 using 语句:
using(var iter = obj.GetEnumerator()) {
...
}
即使没有通用版本,你也可以作弊:
IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
...
}
如果它是 IDisposable 会释放 iter
【讨论】:
没有一次性物品必须被丢弃,永远。[1]
但他们应该是。由于using 块使用finally 子句进行处理,并且无论using 块是正常退出还是通过异常退出,都会执行此操作,因此默认情况下即使遇到异常也会进行处理。
[1] 我想可能会有一个错误的实现,其中持有非托管资源并且没有终结器,但正确的操作是实现终结器。
【讨论】:
IDisposable 对象可能是一个连接、一个文件、一个事务等(即可以竞争的东西;注意这可能在一个迭代器块内,所以适用于IEnumerator case) - 那么等待一个非确定性的 GC 可能会非常糟糕。 IMO“必须”非常合适。