Не по каждому элементу автоматически вызвать Dispose?
в C#, foreach автоматически вызывает Dispose на любом объекте, реализующем IDisposable?
http://msdn.microsoft.com/en-us/library/aa664754 (v=vs.71). aspx похоже, указывает, что он делает:
*в противном случае выражение коллекции имеет тип, который реализует System.IEnumerable, и расширение оператора foreach является: Копировать
IEnumerator enumerator =
((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
while (enumerator.MoveNext()) {
ElementType element = (ElementType)enumerator.Current;
statement;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
2 ответа:
этот вопрос / ответ плохо сформулировано.
неясно, если заданный вопрос:
Q: "располагает ли foreach объекты, возвращенные перечислителем, перед переходом к следующему?"
A: ответ, Конечно, нет. Он ничего не делает, кроме предоставления удобного способа запуска некоторого кода один раз для каждого объекта в перечислении.
или Означает ли это:
вопрос: "под капотом, по каждому элементу используется перечислимый объект. Это вам удалено после вызова foreach, даже если в блоке итератора есть исключение?"
A: ответ (все еще довольно очевидно) да! Поскольку синтаксис не предоставляет вам доступ к перечислителю, он несет ответственность за его удаление.
ответ на второй вопрос, где возникает путаница, так как люди слышали, что foreach расширяется до блока while с блоком try / finally. Цель этого, наконец, состоит в том, чтобы убедиться, что перечислитель утилизировать, если он реализует IDisposable.
в случае, если вам нужно увидеть его для себя: увидеть его в действии здесь
надеюсь, это поможет прояснить! ;)