Эти два вопроса почти отвечают на мой собственный вопрос, но не совсем. Считайте, что это дополнительный вопрос к ним.
- Нужно ли мне рассмотреть вопрос об утилизации любого IEnumerable‹ T› я использую?
- Понимание блоков итератора и метода Dispose
Я понимаю, что цикл foreach
будет Dispose
перечислителя, когда с ним будет покончено.
Мой вопрос таков:
Если рассматриваемый перечислитель на самом деле является блоком итератора С# (т.е. GetEnumerator()/yield
) класса IEnumerable<T>
, который сам реализует IDisposable
, могу ли я быть уверен, что сам объект будет удален? Или мне нужно прибегнуть к явному вызову GetEnumerator()/MoveNext()/Current
внутри блока using
?
EDIT: Этот фрагмент демонстрирует ответ @JonSkeet.
РЕДАКТИРОВАНИЕ №2: Этот фрагмент, основанный на комментариях @JonSkeet, демонстрирует идеальное использование. Блок итератора отвечает за время жизни необходимых ресурсов, а не сам перечислимый объект. Таким образом, перечислимое может быть перечислено несколько раз, если это необходимо - у каждого перечисляемого есть свой собственный ресурс для работы.
foreach
поверхIEnumerator<T> where T : IEnumerable<U>, IDisposable
удалять объекты типаU
? Конечно нет, зачем это делать? Если я перечислю набор открытых сокетов, должны ли сокеты автоматически закрываться? - person Jon   schedule 05.03.2014IDisposable
и не имеет методаDispose
, поэтому его нельзя удалить.IEnumerator<T>
расширяетIDisposable
, а неIEnumerable<T>
. - person Servy   schedule 05.03.2014IDisposable
, аforeach
не избавился бы от него. - person Servy   schedule 05.03.2014