Ответ вслух Junior Исключения обновлено

finally, using и освобождение ресурсов

Вопрос

Расскажите, как гарантированно освободить ресурс в C#, даже при исключении.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Базовый механизм это try/finally: блок finally выполняется при любом выходе из try, будь то нормальное завершение, return или исключение. Поверх него сделан оператор using: он гарантирует вызов Dispose у объекта, реализующего IDisposable.

Что должно прозвучать в ответе

  • Блок finally выполняется при любом выходе из try

  • using разворачивается в try/finally с вызовом Dispose

  • using-объявление (C# 8): using var до конца области видимости

  • await using и IAsyncDisposable для асинхронного освобождения

  • finally не выполнится при завершении процесса и StackOverflow

Что могут спросить следом

  • Что будет, если исключение бросит сам Dispose?
  • Когда finally не выполнится?

Разбор

Базовый механизм это try/finally: блок finally выполняется при любом выходе из try, будь то нормальное завершение, return или исключение. Поверх него сделан оператор using: он гарантирует вызов Dispose у объекта, реализующего IDisposable.

С C# 8 удобно использовать using-объявление: using var stream = File.OpenRead(path);, и Dispose вызовется в конце текущего блока. Для асинхронных ресурсов, например соединений с базой или DbContext, есть IAsyncDisposable и await using.

Важно помнить ограничения: finally не выполнится, если процесс убит, при Environment.FailFast и при переполнении стека. А если исключение бросит сам Dispose внутри finally, оно заменит исходное, поэтому Dispose должен быть максимально безопасным.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.