在finalizer中调用Connection.Close/Dispose



我一直调用Connection。在finally块中关闭,但我今天了解到你不应该这么做:

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

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

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

否,如果使用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只需返回到池的连接。它不会在物理上关闭连接。

您所做的一切都很好。终结器与finally块不同。退房http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers讨论终结器是什么。

最新更新