c#处理datacontext

时间:2011-04-15 11:27:40

标签: c# asp.net linq scope dispose

具有相同功能的3个示例:

方法1

使用使用大括号

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

使用没有大括号

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

没有大括号,并在使用区块内返回

public static int TicketsRequiringSupportResponse()
{
    using (var dc = new CrystalCommon.MainContext())
        return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}

所有这些都妥善处理吗?方法3是最好的,代码最少,但我担心它不能正确处理,因为return语句会中断。

4 个答案:

答案 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参数赋予一些描述性名称。