Подтвердить что ты не робот

Что происходит, когда "return" вызывается из блока "using"?

Если у меня есть метод с использованием блока вроде этого...

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

..., который возвращает значение из блока использования, остается ли объект IDisposable?

4b9b3361

Ответ 1

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

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

Ответ 2

От документация MSDN:

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

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