Не по каждому элементу автоматически вызвать 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 53

2 ответа:

да, foreach вызовет Dispose () на перечислителе, если он реализует IDisposable.

этот вопрос / ответ плохо сформулировано.

неясно, если заданный вопрос:

Q: "располагает ли foreach объекты, возвращенные перечислителем, перед переходом к следующему?"

A: ответ, Конечно, нет. Он ничего не делает, кроме предоставления удобного способа запуска некоторого кода один раз для каждого объекта в перечислении.

или Означает ли это:

вопрос: "под капотом, по каждому элементу используется перечислимый объект. Это вам удалено после вызова foreach, даже если в блоке итератора есть исключение?"

A: ответ (все еще довольно очевидно) да! Поскольку синтаксис не предоставляет вам доступ к перечислителю, он несет ответственность за его удаление.

ответ на второй вопрос, где возникает путаница, так как люди слышали, что foreach расширяется до блока while с блоком try / finally. Цель этого, наконец, состоит в том, чтобы убедиться, что перечислитель утилизировать, если он реализует IDisposable.

в случае, если вам нужно увидеть его для себя: увидеть его в действии здесь

надеюсь, это поможет прояснить! ;)