【问题标题】:Calling Connection.Close/Dispose in finaliser在终结器中调用 Connection.Close/Dispose
【发布时间】:2011-06-08 12:03:33
【问题描述】:

我一直在 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

【问题讨论】:

  • finally block 和 finalizer 是两个完全不同的结构,目的完全不同。
  • 谢谢大家,有点担心和困惑!

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


【解决方案1】:

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

【讨论】:

  • 我知道你可以嵌套使用,但我想知道你是否也可以将它们组合起来并产生相同的效果?
【解决方案2】:

你正在做的很好。终结器与 finally 块不同。查看 http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers 讨论什么是终结器。

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2016-08-01
    相关资源
    最近更新 更多