如果从IEnumerator <t> .MoveNext()或.Current抛出异常,是否仍然要处理?</t>

时间:2010-12-11 09:44:46

标签: c# exception dispose idisposable ienumerator

直觉我认为是的,但我不确定是否有一些我不了解的惯例。

2 个答案:

答案 0 :(得分:6)

由于我们无法知道实施是什么,唯一安全的答案是“是”。

但是,直接使用IEnumerator非常罕见 - foreach更为常见。对于通用IEnumerator<T>,您可以使用using语句:

using(var iter = obj.GetEnumerator()) {
    ...
}

即使没有通用版本,您也可以作弊:

IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
    ...
}

如果它是IDisposable将会处置它

答案 1 :(得分:0)

永远不会丢弃一次性物品 [1]

但他们应该。由于using块使用finally子句进行处理,无论using块是正常退出还是通过异常执行,都会执行此操作,默认情况下即使面对异常也要处置


[1] 我想有人可能会有一个错误的实现,其中包含非托管资源且没有终结者,但正确的操作是实现终结者。