LINQ IEnumerable extensions вызывают Dispose на их IEnumerable?
Учитывая, что я написал класс, который реализует IEnumerable
, и возвращает IEnumerator
, а не только IDisposable
по характеру, являющимся перечислителем, но из-за того, что он управлял ресурсами, которые ему необходимы для Dispose()
после его завершения перечисление, могу ли я доверять, что следующие Dispose()
эти управляемые ресурсы, пока мой перечислитель правильно распределяет эти управляемые ресурсы в своей реализации IDisposable
?
return (new MyClass()).Select(x => x);
EDIT: этот вопрос, по-видимому, похож на тот, который похож на него, но он семантически отличается от IMO (я видел его до того, как задал вопрос)
Ответы
Ответ 1
Да, вы можете положиться на вызов Dispose()
на своих итераторах внутри методов LINQ.
В ссылочном коде, опубликованном Microsoft, использование итераторов относится к трем категориям:
- Итераторы используются из цикла
foreach
, который обеспечивает вызов Dispose()
или
- Итераторы используются в сочетании с циклом
while
; эти итераторы расположены явно
- Итераторы получаются внутри блока
using
, что обеспечивает автоматическое удаление.
Во всех этих случаях библиотека обеспечивает завершение процесса итератора Dispose()
.