Если исключение выдается из IEnumerator <T>.MoveNext () или .Current, должно ли оно по-прежнему удаляться? - PullRequest
2 голосов
/ 11 декабря 2010

Интуитивно я думаю, что да, но я не уверен, есть ли какое-то соглашение, о котором я не знаю.

Ответы [ 2 ]

6 голосов
/ 11 декабря 2010

Поскольку мы не можем знать, что такое реализация, единственный надежный ответ - «да».

Однако, очень редко можно использовать IEnumerator напрямую - foreach чаще. Для универсального IEnumerator<T> вы можете использовать оператор using:

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

Даже без универсальной версии вы можете обмануть:

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

Который избавится от iter, если его можно идентифицировать

0 голосов
/ 11 декабря 2010

Нет одноразовых предметов ДОЛЖЕН * утилизироваться . [1]

Но они должны быть. Поскольку блок using использует предложение finally для удаления, и оно выполняется независимо от того, завершается ли блок using обычным образом или с помощью исключения, по умолчанию используется удаление даже перед лицом исключения.


[1] Полагаю, у кого-то может быть ошибочная реализация, где неуправляемый ресурс удерживается, а финализатор отсутствует, но существует правильное действие для реализации финализатора.

...