finally, using и освобождение ресурсов
Вопрос
Расскажите, как гарантированно освободить ресурс в C#, даже при исключении.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Блок 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 ошибок.