【问题标题】:Is there an advantage to USING vs. declaring a context variable?使用与声明上下文变量相比有优势吗?
【发布时间】:2009-11-05 15:00:50
【问题描述】:

这两个 sn-ps 做同样的事情 - 有一个比另一个更好,还是只是偏好问题?

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

对比

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

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

【问题讨论】:

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


    【解决方案1】:

    第一个在Using 语句末尾调用Dispose - 这就是Using 语句的重点。相当于 Try/Finally,所以即使抛出异常,资源也会被释放。

    【讨论】:

      【解决方案2】:

      Tony the Pony 的回答是准确的,Using 的重点是在您使用完对象后处理非托管资源。等效代码:

      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
      

      【讨论】:

        【解决方案3】:

        两个 sn-ps 不做同样的事情。第一个将在 using 块的末尾dispose您的数据上下文,即使抛出异常也是如此。后者 sn-p 不会释放它,这可能会留下额外的数据库连接。

        【讨论】:

          【解决方案4】:

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

          使用 LINQ2SQL DataContext,您必须小心延迟执行。您不希望在 Using 块中放置延迟查询,并在 Using 块之后枚举结果。您将收到有关正在处理的上下文的异常。

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

          【讨论】:

            【解决方案5】:

            当你使用 using - 对象在使用范围结束时被销毁,而不是稍后。 如果对象有特殊的资源需要处理——它会提前释放它们——所以当你使用数据库连接时——它会很聪明地使用“使用”例如。

            【讨论】:

            • 对象不会被销毁。只需调用Dispose(),这应该会导致对象释放对非托管资源的任何引用。但该物体之后仍然存在。不过,它可能只是无法使用。
            • @Dani:这取决于类型。例如,您仍然可以通过调用 ToArray 从 MemoryStream 中取出数据。
            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 2016-09-09
              • 2015-07-20
              • 2018-02-19
              • 2018-10-08
              • 2012-12-09
              • 1970-01-01
              • 2021-08-22
              • 2010-09-24
              • 2010-12-27
              相关资源
              最近更新 更多