如果对象在 using 块中,将 SqlConnecions 作为私有字段的对象是否会关闭?

Do objects with SqlConnecions as private fields get closed if the object is in an using block?

我知道像下面这样在 using 块中使用 SqlConnection 会在 using 块结束时关闭连接。

using (var connection = factory.NewSqlConnection())
{
    //code
}

我想知道具有 SqlConnection 私有字段并在 using 语句中使用的对象是否也会像这样关闭连接:

using (var db = factory.NewDatabaseManager())
{
    //code
} 

public class DatabaseManager
{
    private SqlConnection _connection;

    public DatabaseManager(SqlConnection connection)
    {
         _connection = connection;
    }
}

如果我没理解错的话,DatabaseManager class 是在 using 语句中使用的,所以它必须实现 IDisposable,因此有一个 Dispose 自己的方法。

在这种情况下,仅当 DatabaseManager class 中的 Dispose 方法调用 SqlConnection 对象的 Dispose 方法。没有魔法可以让这一切发生。您的代码必须正确管理 SqlConnection 否则您将遇到问题。

可以,但您必须编写代码才能执行此操作。这是您现在使用 DatabaseManager 实现 IDisposable 的示例。在 using 语句之前会给你一个编译时错误,因为它没有实现那个。

下面的 _connection 也称为 field,而不是 attribute,后者完全不同。

在您开始在您的类型中实现 IDisposable 之前,请参阅实现 IDisposable 的正确方法,就像它不应该抛出异常一样。这是 Microsoft take on the Dispose pattern,它是一个很好的清单,列出了该做什么和该避免什么。

using (DatabaseManager db = factory.NewDatabaseManager())
{
    //code
} 

public class DatabaseManager : IDisposable
{
    private SqlConnection _connection;

    public DatabaseManager(SqlConnection connection)
    {
         _connection = connection;
    }

    // basic implementation of IDisposable
    public void Dispose() {
        _connection.Dispose();
    }
}