Подтвердить что ты не робот

LINQ IEnumerable extensions вызывают Dispose на их IEnumerable?

Учитывая, что я написал класс, который реализует IEnumerable, и возвращает IEnumerator, а не только IDisposable по характеру, являющимся перечислителем, но из-за того, что он управлял ресурсами, которые ему необходимы для Dispose() после его завершения перечисление, могу ли я доверять, что следующие Dispose() эти управляемые ресурсы, пока мой перечислитель правильно распределяет эти управляемые ресурсы в своей реализации IDisposable?

return (new MyClass()).Select(x => x);

EDIT: этот вопрос, по-видимому, похож на тот, который похож на него, но он семантически отличается от IMO (я видел его до того, как задал вопрос)

4b9b3361

Ответ 1

Да, вы можете положиться на вызов Dispose() на своих итераторах внутри методов LINQ.

В ссылочном коде, опубликованном Microsoft, использование итераторов относится к трем категориям:

  • Итераторы используются из цикла foreach, который обеспечивает вызов Dispose() или
  • Итераторы используются в сочетании с циклом while; эти итераторы расположены явно
  • Итераторы получаются внутри блока using, что обеспечивает автоматическое удаление.

Во всех этих случаях библиотека обеспечивает завершение процесса итератора Dispose().