什么时候应该在VB.Net SqlConnections,SqlCommands等上显式调用Close()和Dispose()之类的东西?

时间:2013-06-10 18:15:55

标签: vb.net garbage-collection idisposable sqlconnection

采用这样的代码:

    Dim dt As New DataTable("Table")
    Dim sda As New SqlDataAdapter(pQuery, pCon)

    sda.SelectCommand.CommandTimeout = pCommandTimeout
    sda.Fill(dt)
    sda.Dispose()

    Return dt

    Dim myconnection As SqlConnection = New SqlConnection(DBValues.m_sDBString)
    myconnection.Open()

    Try
        Dim com As New SqlCommand(cmd, myconnection)
        com.ExecuteNonQuery()
        com.Dispose()
    Catch ex As Exception
        Throw ex
    Finally
        If myconnection.State = ConnectionState.Open Then
            myconnection.Close()
            myconnection.Dispose()
        End If
    End Try

什么时候过度表达会调用Close()和Dispose()之类的东西?因为GC显然在大部分时间内部处理,但不是所有时间(?)。到目前为止,我还没有真正看到有人对如何区分何时过度和何时过分做出非常明确和明确的解释,或者明确地做这个和让GC处理它之间有什么区别。有人可以解释一下吗?谢谢!

1 个答案:

答案 0 :(得分:3)

如果您没有做比示例中更复杂的事情,那么它可能过度。

您可以使用using关键字来简化操作。它自动从实现Dispose的类中调用对象的IDisposable方法。

Relevant documentation on the using keyword, for VB.NET

另请注意,Dispose SqlConnection方法也调用其Close方法(运行您在代码中执行的相同状态验证)。

请注意,在某些情况下,您可能需要手动调用Dispose,而不是使用using。例如,您可能希望在多个上下文中使用数据读取器,因此可能不希望在其中任何一个中使用using。你会知道你何时处于这些情况之一,然后自己打电话给Dispose并不会有点矫枉过正。但只有这样。