2010-02-17 2 views
17

Если у меня есть метод с использованием блока, как это ...Что происходит, когда 'return' вызывается из блока 'using'?

public IEnumerable<Person> GetPersons() 
    { 
     using (var context = new linqAssignmentsDataContext()) 
     { 
      return context.Persons.Where(p => p.LastName.Contans("dahl")); 
     } 
    } 

... что возвращает значение внутри с помощью блока, делает объект IDisposable до сих пор получить расположены?

+0

См. Также http://stackoverflow.com/questions/662773/returning-in-the-middle-of-a-using-block и http://stackoverflow.com/questions/1223865/best-practice-regarding -returning-from-using-blocks –

+1

Проверьте свой сгенерированный код с помощью ILDASM или Reflector. –

ответ

28

Да, так оно и есть. Утилизация объекта происходит в блоке finally, который выполняется даже перед обратным вызовом. Это существенно расширяет к следующему коду

var context = new linqAssignmentsDataContext(); 
try { 
    return context.Persons.Where(p => p.LastName.Contans("dahl")); 
} finally { 
    if (context != null) { 
    context.Dispose(); 
    } 
} 
6

От the MSDN documentation:

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

Таким образом, объект всегда расположен. Если вы не подключите кабель питания.

+11

«Таким образом, объект всегда расположен. Если вы не подключите кабель питания». - В этом случае объект располагается, когда электроны рассеиваются ;-) – Nick

+1

Напоминает мне об этой статье TheDailyWTF (первая): http://thedailywtf.com/Articles/My-Tales.aspx –

+1

Вызов Environment.FailFast будет также не вызывать Dispose в дополнение к вытягиванию силового кабеля. –

Смежные вопросы