USING与声明上下文变量是否有优势?

时间:2009-11-05 15:00:50

标签: .net vb.net linq linq-to-sql

这两个片段做同样的事情 - 是否有一个比另一个好,或者只是一个偏好的问题?

Using context As MyDatabaseDataContext = New MyDatabaseDataContext()
    Dim test = context.Employees.Count
End Using

VS

Dim context As MyDatabaseDataContext = New MyDatabaseDataContext()
Dim test = context.Employees.Count

我意识到这些是过于简单的例子 - 一种方法比另一种方法效果好的情况是什么?

6 个答案:

答案 0 :(得分:10)

第一次在Dispose语句末尾调用Using - 这是Using语句的要点。它等同于Try / Finally,因此即使抛出异常,也会处置资源。

答案 1 :(得分:3)

Tony the Pony的答案是准确的,使用的目的是在完成对象后处理非托管资源。等效代码:

Using context As New MyDatabaseDataContext()
    Dim test = context.Employees.Count
End Using

将是:

Dim context As New MyDatabaseDataContext()
Try
    Dim test = context.Employees.Count
Finally
    If context IsNot Nothing
        context.Dispose()
    End If
End If

答案 2 :(得分:2)

这两个片段不会做同样的事情。第一个将在使用块结束时处理您的数据上下文,即使抛出异常也是如此。后一个片段不会丢弃它,这可能会留下额外的数据库连接。

答案 3 :(得分:1)

第一个调用Using块末尾的dispose。所以是的,那里有一个优势。

使用LINQ2SQL DataContext,您必须小心延迟执行。您不希望在Using块中放置延迟查询,并在Using块后枚举结果。您将获得有关正在处理的上下文的例外情况。

Using块与WCF服务客户端一起使用时,您还必须小心。您可能会遇到异常传播问题。

答案 4 :(得分:1)

当你使用时 - 对象在使用范围的最后被破坏,而不是以后。 如果该对象具有要处置的特殊资源 - 它将更早地释放它们 - 所以当您使用数据库连接时 - 例如,使用“使用”将是智能的。

答案 5 :(得分:0)

使用保证,即使抛出异常,也会在块末尾的上下文中调用Dispose方法。

使用文件,数据库连接等一次性资源时非常重要。