繁体   English   中英

使用语句和关闭方法

[英]Using statement and Close methods

与数据库连接object一起使用时,using语句是否真的调用了close方法? MSDN 文档说它确保调用 Dispose 方法,但没有提及关闭。 我在 Stack Overflow 上看到人们说它两者兼而有之的帖子。 是否有人从微软或其他可靠的证据中得到了具体的答案?

下面是 SqlConnection class 的“Dispose”方法:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

如您所见,它确实调用了 Close()

如果您使用using语句,连接将被关闭,那么实现 IDisposable 的 object 在垃圾收集后将保持打开状态是没有意义的......

但是Close()Dispose()不是一回事:

  • Dispose()总是隐式调用Close()
  • Dispose()清除 ConnectionString, Close()不会。
  • 如果你要重新打开连接,你应该Close()而不是Dispose()

如果您选择使用Dispose()不要直接调用它, using语句是最好的方法。

调用Close方法将调用Dispose 调用哪一个并不重要。

一个具体的例子是FileStream.Close()方法:

Close 的此实现调用 Dispose 方法并传递一个真值。

如果任何 Class 实现了 IDisposable 接口,它都可以具有 Dispose 方法。

MSDN 说:“这个接口的主要用途是释放非托管资源。”

由实现者决定这到底意味着什么。

在 DBConnection 的情况下,disposing 也意味着关闭连接......

请记住,所有 Close() 所做的只是将连接释放回连接池。 您仍然会注意到 SQL 服务器中的数据库的活动连接。 如果您需要确保它也被关闭,您可能需要考虑ClearAllPoolsClearPool

MSDN连接池减少了需要打开新连接的次数。 pooler 维护物理连接的所有权。 它通过为每个给定的连接配置保持一组活动连接来管理连接。 每当用户在连接上调用 Open 时,池化程序都会查看池中是否有可用的连接。 如果池连接可用,则将其返回给调用者,而不是打开新连接。 当应用程序在连接上调用 Close 时,池化程序将其返回到池中的活动连接集,而不是实际关闭它。 一旦连接返回到池中,它就可以在下一次 Open 调用中被重用。

Close 和 Dispose 做同样的事情。 他们添加 Close 只是为了便于阅读,因为说您“关闭连接”更自然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM