В вопросе, если connection.Dispose()
вызывается для соединения null
без проверки, вы вызываете новое исключение, которое не было обработано, и все, что с этим связано.Кроме того, если это было сделано из-за того, что переменная connection
была установлена на null
до того, как блок finally
не был закрыт, возможно утечка этого открытого соединения ... хотя и какНа практике редко можно увидеть код в дикой природе, который знает, что нужно использовать finally
, но также хочет установить соединение на null
.
Предоставление отсутствия using
(что подозрительно, нокак бы то ни было), я предпочитаю этот шаблон:
finally
{
if (connection is IDisposable) connection.Dispose();
}
Этот по-прежнему защищает от null
значений * в connection
объекте и является более близкой имитацией того, что using
шаблон уже делал за кулисами.
Обратите внимание, однако, что вы все еще упускаете одну важную особенность блока using
, которая является защитой от чего-то, присваивающего null
вашей переменной до его закрытия.Блоки using
также защищают ваше соединение в отдельной (скрытой) переменной, поэтому вы уверены, что у вас все еще есть действительная ссылка в конце блока (это ново в C # 8).
* (Для полноты автор этого связанного твита является лидером в команде компиляторов C #, поэтому он должен знать, и он не иронизирует).