Выбор ответа Junior Исключения спрашивают часто обновлено

using и исключения

Вопрос

Внутри using (var conn = new SqlConnection(...)) { ... } выбрасывается исключение. Что произойдёт с соединением?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Dispose будет вызван: using это try/finally. Оператор using компилируется в try { ... } finally { conn?.Dispose(); }, поэтому ресурс освобождается при любом выходе из блока, в том числе при исключении.

Варианты ответа

  1. Dispose не вызовется, соединение позже закроет GC
  2. Dispose будет вызван: using это try/finallyправильный ответ
  3. Dispose вызовется, только если исключение поймано внутри
  4. Исключение будет проглочено using после Dispose

Разбор

Оператор using компилируется в try { ... } finally { conn?.Dispose(); }, поэтому ресурс освобождается при любом выходе из блока, в том числе при исключении. Исключение не глотается, а летит дальше после Dispose. Надеяться на GC для соединений нельзя: финализация не детерминирована, пул соединений закончится раньше.

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

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