foreach автоматически вызывает dispose?

<p>в c # ли foreach автоматически вызывает dispose для любого объекта, реализующего idisposable?</p><p> <a href="http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx">http://msdn.microsoft.com/en-us/library/aa664754 (v = vs.71) .aspx</a> , по-видимому, указывает на то, что:</p><p>* в противном случае выражение коллекции относится к типу, который реализует system.ienumerable, и расширение оператора foreach выглядит так:</p><pre><code>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(); } </code></pre>

<p>да, foreach будет вызывать dispose () для перечислителя, если он реализует idisposable.</p>

<p>этот вопрос/ответ плохо сформулирован.</p><p>не ясно, если заданный вопрос:</p><p>q: "располагает ли foreach объекты, возвращаемые перечислителем, перед тем как перейти к следующему?"</p><p>a: ответ, конечно, нет. он ничего не делает, кроме как обеспечивает удобный способ запуска некоторого кода один раз для каждого объекта в перечислении.</p><p>или это означает:</p><p>q: "под капотом foreach использует перечислимый объект. удаляется ли это после вызова foreach, даже если в блоке итератора есть исключение?"</p><p>a: ответ (все еще довольно очевидно) да! поскольку синтаксис не предоставляет вам доступ к перечислителю, он несет ответственность за его удаление.</p><p>ответ на второй вопрос заключается в том, где возникает путаница, поскольку люди слышали, что foreach расширяется до блока while с блоком try/finally. наконец, цель этого состоит в том, чтобы гарантировать, что перечислитель удаляется, если он реализует idisposable.</p><p>в случае, если вам нужно увидеть это для себя: <a href="http://msdn.microsoft.com/en-us/library/aa664754%28v=vs.71%29.aspx">смотрите это в действии здесь</a> </p><p>надеюсь, это поможет уточнить! ;)</p>