Будет ли удален IDisposable, если блок using возвращается? - PullRequest
6 голосов
/ 15 июня 2011

Например

using(var something = GetSomething())
{
    something.DoSomething();
    if(something.IsX()) return true;
}
return false;

Ответы [ 6 ]

8 голосов
/ 15 июня 2011

Да, абсолютно.Метод Dispose вызывается, однако оператор using выполняется, если только он не был внезапным завершением всего процесса.Наиболее распространенные случаи:

  • A return в блоке
  • Исключение, которое выдается (и не перехватывается) в блоке
  • Достигается конецблок, естественно,

В основном оператор using в основном является синтаксическим сахаром для блока try / finally - и finally имеет все те же свойства.

EDIT: Из раздела 8.13 спецификации C # 4 :

using оператор разделен на три части: приобретение, использование и утилизация.Использование ресурса неявно заключено в оператор try, который включает в себя предложение finally.Это предложение finally удаляет ресурс.

Оператор finally описан в разделе 8.10 спецификации:

Операторы блока finallyвсегда выполняются, когда управление покидает оператор try.Это верно, если передача управления происходит в результате нормального выполнения;в результате выполнения оператора break, continue, goto или return;или в результате распространения исключения из оператора try.

2 голосов
/ 15 июня 2011

Да.

using - синтаксический сахар для блока try / finally :

Использование оператора гарантирует, что Dispose вызывается, даже если исключение происходит во время вызова методов на объекте. Вы можете достичь тот же результат, поставив объект внутри блока try, а затем вызывая Утилизировать в блоке finally;

В документации по блоку finally :

Принимая во внимание, что улов используется для обработки исключения, которые встречаются в утверждении блок, наконец, используется, чтобы гарантировать блок операторов кода выполняется независимо от того, как предыдущая попытка блок снят.

Итак, using переводится в try/finally, с .Dispose() в finally части, гарантируя, что он всегда выполняется независимо от того, что происходит в try / catch.

1 голос
/ 15 июня 2011

Да, используется функция компилятора, которая расширяется до

try {
  ...
  return ...;
}
finally {
  foo.Dispose();
}
0 голосов
/ 16 июня 2011

Еще один момент, о котором еще не говорилось, заключается в том, что хотя «return» в блоке «using» вызовет Dispose для управляемой переменной, «return yield» из блока «using» в итераторе не будет утилизировать контролируемую переменную если IEnumerator, связанный с итератором, не расположен.

0 голосов
/ 15 июня 2011

Я думаю, как только элемент управления выйдет из {} утилита будет называться так вкратце Yes

0 голосов
/ 15 июня 2011

Насколько я знаю, блок using избавится от объекта, как только он выйдет из области видимости.

Например, когда возвращается значение true, следующий оператор находится вне области видимости, поэтому переменная будет расположена.

...