使用声明返回内部

时间:2013-11-18 14:46:26

标签: c# entity-framework

我有以下功能,它接受员工ID并在员工处于活动状态时返回。

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

问题:我使用了using语句,因此每当using块结束时,在using语句中创建的对象将被释放。但是,在实际使用块结束之前,我已经编写了return语句,所以我的对象是否会被处理?我的方法是否正确?处置是如何发生的?

2 个答案:

答案 0 :(得分:7)

唯一可以解决的问题是using块中明确说明的内容 - 即分配给dbcontext的内容。实际的员工对象处置,并且完全可用 - ,延迟加载或对象导航等任何功能都将拒绝工作,因为数据上下文不可用。< / p>

顺便说一下 - 应该是SingleSingleOrDefault

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

从技术上讲,在IL级别,你不能在try块中ret(这适用于所有代码,而不仅仅是using),所以它实际上就像它被写成一样实现: / p>

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;
}

答案 1 :(得分:2)

using语句实际上表现得像Try / Finally,就像这样:

    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总是被执行,因此上下文将始终处理。