我有以下功能,它接受员工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语句,所以我的对象是否会被处理?我的方法是否正确?处置是如何发生的?
答案 0 :(得分:7)
唯一可以解决的问题是using
块中明确说明的内容 - 即分配给dbcontext
的内容。实际的员工对象不处置,并且完全可用 - 但,延迟加载或对象导航等任何功能都将拒绝工作,因为数据上下文不可用。< / p>
顺便说一下 - 应该是Single
或SingleOrDefault
:
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
块总是被执行,因此上下文将始终处理。