3个功能相同的例子:
方法1
Using使用大括号
public static int TicketsRequiringSupportResponse()
{
int ReturnValue = 0;
using (var dc = new CrystalCommon.MainContext())
{
ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
return ReturnValue;
}
方法2
Using没有大括号
public static int TicketsRequiringSupportResponse()
{
int ReturnValue = 0;
using (var dc = new CrystalCommon.MainContext())
ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
return ReturnValue;
}
3
方法没有大括号,在using块内返回
public static int TicketsRequiringSupportResponse()
{
using (var dc = new CrystalCommon.MainContext())
return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
所有这些都能妥善处理吗?方法3最简洁,代码最少,但我担心它不能正确处理,因为返回语句会中断。
是的,它们都做同样的事情。大括号只增加了显式的作用域;默认情况下,using
只应用于下一条语句。从using
返回仍然会处理(它本质上是一个尝试/最终在幕后)我的偏好是#3,但是为了清晰起见添加了大括号。
实际上,我认为方法1是最简洁的——我知道大括号是额外的,但它们有助于澄清/组织代码。在using块之外声明和返回变量可以使实时调试更容易。
它们都做同样的事情并正确地处置上下文。第一个和第二个完全一样。第一个和第二个都转换成以下代码:
int ReturnValue = 0;
Context dc = null;
try
{
dc = new CrystalCommon.MainContext();
ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
finally
{
if(dc != null)
dc.Dispose();
}
return ReturnValue;
第三个翻译成:
Context dc = null;
try
{
dc = new CrystalCommon.MainContext();
return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
finally
{
if(dc != null)
dc.Dispose();
}
因为finally块是在try块的作用域离开时执行的,所以这两个代码实际上是等价的。
@Talljoe解释得很好,它们都是等效的;我将添加的是第四个示例,它实际上只是演示Talljoe的详细信息,但对格式进行了轻微修改:
public static int TicketsRequiringSupportResponse()
{
using (var dataContext = new CrystalCommon.MainContext())
{
return dataContext .tblHelpCentreQuestions.Where(
question => question.awaitingSupportResponse == true).Count();
}
}
注意,我们为using
添加了范围括号,并进一步从返回语句中删除了多余的括号,然后简单地删除一行并缩进以允许更好的阅读流,而不是长行(然而,长是有争议的)。我还尝试给DataContext
和lambda参数一些描述性的名称。