.net 使用或声明上下文变量是否有优势?

.net 使用或声明上下文变量是否有优势?,.net,vb.net,linq,linq-to-sql,.net,Vb.net,Linq,Linq To Sql,这两个代码片段做了同样的事情——是有一个比另一个更好,还是只是偏好的问题 Using context As MyDatabaseDataContext = New MyDatabaseDataContext() Dim test = context.Employees.Count End Using vs 我意识到这些都是过于简单的例子-在什么情况下一种方法比另一种更好?第一次调用Dispose在Using语句末尾-这就是Using语句的要点。它相当于Try/Finally,因此即使抛

这两个代码片段做了同样的事情——是有一个比另一个更好,还是只是偏好的问题

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


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

第一次调用
Dispose
Using
语句末尾-这就是
Using
语句的要点。它相当于Try/Finally,因此即使抛出异常,也会释放资源。

第一个调用在
块末尾使用
调用dispose。因此,是的,这是一个优势

对于LINQ2SQL DataContext,您必须小心延迟执行。您不希望将延迟查询放入
Using
块中,并在
Using
块之后枚举结果。您将得到一个关于正在处理的上下文的异常


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

当您使用时-对象在使用范围结束时销毁,而不是稍后销毁。
如果对象有特殊的资源要处理-它会更早地释放它们-因此,当您使用db连接时-它将使用“using”(例如)来进行智能处理。

使用保证,即使抛出异常,也会在块末尾对上下文调用dispose方法


在处理文件、数据库连接等可支配资源时,这一点很重要。

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

Tony小马的回答是准确的,使用的目的是在处理完对象后处理非托管资源。等效代码为:

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

这个物体不会被摧毁。只需调用
Dispose()
,这将导致对象释放对非托管资源的任何引用。但后来这个物体还活着。不过,它可能无法使用。@Dani:这取决于类型。例如,通过调用ToArray,您仍然可以在内存流被释放后从内存流中获取数据。
Dim context As New MyDatabaseDataContext()
Try
    Dim test = context.Employees.Count
Finally
    If context IsNot Nothing
        context.Dispose()
    End If
End If