2013-11-18 4 views
5

У меня есть следующая функция, которая принимает идентификатор сотрудника и возвращается, если сотрудник активен.return inside using statement

public employee GetEmployee(int empId) 
{ 
    using(var dbcontext = new dbentities()) 
    { 
    return dbcontext.employee.Where(emp => emp.id == empId and emp.IsActive == true); 
    } 
} 

Вопрос: Я использовал using заявление так всякий раз, когда с помощью блока заканчивается объект, созданный внутри с помощью заявления получит расположенный. Здесь, однако, я написал оператор возврата перед фактическим использованием конца блока, так будет ли мой объект удален или нет? Правильно ли мой подход? Как происходит уничтожение?

ответ

2

using заявление на самом деле ведет себя как Try/Наконец, как это:

try 
    { 
     var dbcontext = new dbentities() 
     return dbcontext.employee.where(emp => emp.id == empId and emp.IsActive == true); 
    } 
    finally 
    { 
     if(dbcontext != null) 
      ((IDisposable)dbcontext).Dispose(); //Per the comment below 
    } 

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

+0

Его 'try-finally', нет улова. – Habib

+0

Вы оба правы, мне нужно больше кофе этим утром. Обновлено за ваши комментарии. –

+0

Это почти правильно. Почему бы не быть «правильным»? См. Http://msdn.microsoft.com/en-us/library/vstudio/yh598w02.aspx –

6

Единственная вещь, которая находится в распоряжении, - это вещь, явно заявленная в блоке using - то есть предмет, назначенный на dbcontext. Фактический объект-работник - , а не, и полностью полезен - , но, любые функции, такие как ленивая загрузка или перемещение объектов, откажутся работать, поскольку контекст данных недоступен.

Btw - это, вероятно, следует Single или SingleOrDefault:

return dbcontext.employee.Single(
    emp => emp.id == empId and emp.IsActive == true); 

Технически, на уровне IL вы не можете ret внутри Ьгу блока (это относится ко всем кодам, а не только using), так что фактически выполняется так, как если бы оно было написано:

public employee GetEmployee(int empId) 
{ 
    employee <>tmp; 
    dbentities dbcontext = new dbentities(); 
    try { 
     <>tmp = dbcontext.employee.Single(
     emp => emp.id == empId and emp.IsActive == true); 
    } finally { 
     if(dbcontext != null) ((IDisposable)dbcontext).Dispose(); 
     // note that for classes this cast is a no-op and doesn't need any IL; 
     // the above gets a little more complex for structs - using 
     // constrained call and no null-check 
    } 
    return <>tmp; 
} 
+0

И 'и' не является ключевым словом C#. –