在终结器中调用Connection.Close / Dispose

时间:2011-06-08 12:03:33

标签: .net ado.net garbage-collection connection database-connection

我总是在finally块中调用Connection.Close,但是我今天才知道你aren't supposed to do that

  

不要在类的Finalize方法中对Connection,DataReader或任何其他托管对象调用Close或Dispose。在终结器中,您应该只释放您的类直接拥有的非托管资源。如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法

因此,在理解处理SqlCommand对象不会释放或关闭分配给它的连接对象的情况下,以下(下面的简化代码)会同时处理命令和连接对象吗?如果我确定我总是调用Connection.Close,我真的需要调用Connection.Dispose吗?

Using cmd As New NpgsqlCommand(String.Empty, new connection())
    cmd.CommandText = "some sql command here"
    sqlCmd.Connection.Open()
    ...create and fill data table
    sqlCmd.Connection.Close()
End Using

2 个答案:

答案 0 :(得分:5)

不,如果您使用Using块,则无需显式调用Close。这是我写它的方式:

Using conn As New SqlConnection("SOME CONNECTION STRING")
    Using cmd = conn.CreateCommand()
        conn.Open()
        cmd.CommandText = "some sql command here"

        ' ... create and fill data table
    End Using
End Using

同时调用Close不会关闭连接。 ADO.NET使用连接池,因此调用Close只会返回到池的连接。它没有实际关闭连接。

答案 1 :(得分:1)

你做得很好。终结器与最终块不同。查看http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers以了解终结器的内容。