Располагаются ли ресурсы, даже если исключение выбрано в блоке использования?
Возможный дубликат:
Вызывается ли метод Dispose при вызове Exception внутри параметра Использование statment?
У меня есть количество блоков using
при доступе к базе данных. Мне было интересно: если исключение должно было быть выбрано в блоке использования, будут ли все необходимые ресурсы оставлены, хотя конец блока не будет достигнут? Или мне нужно закрыть их вручную вручную в блоке catch
?
Ответы
Ответ 1
Ресурсы, определенные с помощью оператора using
, были расположены, это основная причина, по которой using
подходит.
Оператор using гарантирует, что Dispose вызывается , даже если исключение возникает, когда вы вызываете методы на объекте. Ты можешь добиться того же результата, поставив объект внутри блока try и затем вызов Dispose в блоке finally; на самом деле, именно так using оператор переводится компилятором.
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx
Ответ 2
Да, ресурс используемого блока будет удален.
Ответ 3
Ты бы не стал. Фактически блок using
тот же, если вы используете конструкцию try{}catch{}finally{}
с вызовом метода Dispose в блоке finally. Так оно и будет называться.
Ответ 4
Да, элемент будет удален, так как вызов является частью блока finally
try
, в который преобразуется using
.
Из 8.13 спецификации С#:
Оператор using используется в трех частях: получение, использование, и утилизации. Использование ресурса неявно заключено в попытке который включает предложение finally. Это окончательное предложение ресурса. Если нулевой ресурс получен, то нет вызова Dispose сделан, и исключение не выбрасывается.
Таким образом, вам не нужно будет утилизировать его вручную, и я не уверен, где ваш собственный блок catch
будет в этом случае в любом случае.