具有相同功能的3个示例:
使用使用大括号
public static int TicketsRequiringSupportResponse()
{
int ReturnValue = 0;
using (var dc = new CrystalCommon.MainContext())
{
ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
return ReturnValue;
}
使用没有大括号
public static int TicketsRequiringSupportResponse()
{
int ReturnValue = 0;
using (var dc = new CrystalCommon.MainContext())
ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
return ReturnValue;
}
没有大括号,并在使用区块内返回
public static int TicketsRequiringSupportResponse()
{
using (var dc = new CrystalCommon.MainContext())
return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
所有这些都妥善处理吗?方法3是最好的,代码最少,但我担心它不能正确处理,因为return语句会中断。
答案 0 :(得分:5)
是的,他们都做同样的事情。大括号只增加明确的范围;默认情况下,using
仅适用于下一个语句。退出using
仍将处置(它基本上是一次尝试/终于幕后)我的偏好是#3,但为了清晰起见,添加了大括号。
答案 1 :(得分:3)
实际上,我会说方法1是最好的IMO - 我知道大括号是额外的,但它们有助于澄清/组织代码。将您的变量声明并在using块之外返回,可以更轻松地进行实时调试。
答案 2 :(得分:1)
他们都做同样的事情并正确处理上下文。第一个和第二个是完全相同的。第一个和第二个都转换为以下代码:
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();
}
因为在try块的范围被保留时执行finally块,所以两个代码实际上是等价的。
答案 3 :(得分:1)
@Talljoe解释得很好,它们都是等价的;我要添加的是第四个例子,它实际上只是演示了Talljoe的细节,但稍微修改了格式:
public static int TicketsRequiringSupportResponse()
{
using (var dataContext = new CrystalCommon.MainContext())
{
return dataContext .tblHelpCentreQuestions.Where(
question => question.awaitingSupportResponse == true).Count();
}
}
注意,我们为using
添加了作用域括号,并进一步从return语句中删除了多余的括号,然后简单地删除一行并缩进以允许更好的读取流程,而不是长行(但是, long 是值得商榷的。)我也试图给DataContext
和lambda参数赋予一些描述性名称。