Что происходит, когда "return" вызывается из блока "using"?
Если у меня есть метод с использованием блока вроде этого...
public IEnumerable<Person> GetPersons()
{
using (var context = new linqAssignmentsDataContext())
{
return context.Persons.Where(p => p.LastName.Contans("dahl"));
}
}
..., который возвращает значение из блока использования, остается ли объект IDisposable?
Ответы
Ответ 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 транслируется компилятором.
Таким образом, объект всегда удаляется. Если вы не подключите кабель питания.