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

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

提问人:James Madison 提问时间:3/3/2016 最后编辑:James Madison 更新时间:3/3/2016 访问量:96

问:

我知道在如下所示的 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;
    }
}
C# 对象 使用 using 指令 释放

评论

1赞 Dennis 3/3/2016
这不是一个属性,它只是一个私有字段。您应该在 DatabaseManager 中实现 IDisposable 并释放连接。

答:

2赞 Tony Vitabile 3/3/2016 #1

如果我理解正确的话,该类是在语句内部使用的,因此它必须实现,因此有自己的方法。DatabaseManagerusingIDisposableDispose

在这种情况下,仅当类中的方法调用对象的方法时,才会释放该对象。没有任何魔法可以做到这一点。您的代码必须正确管理,否则您将遇到问题。SqlConnectionDisposeDatabaseManagerSqlConnectionDisposeSqlConnection

评论

0赞 James Madison 3/3/2016
DatabaseManager 没有实现 IDisposable,应该吗?
1赞 Tony Vitabile 3/3/2016
如果你要在语句中使用它,它必须这样做。编译器不允许你在语句中使用它,除非它实现了 .考虑到你要做的事情,它绝对应该。usingusingIDisposable
0赞 RiceRiceBaby 3/3/2016
不要忘记关闭 DatabaseManager 类的 dispose 方法上的 sql 连接,就像 Tony 说的那样。
2赞 Igor 3/3/2016 #2

它可以,但你必须编写代码才能做到这一点。下面是 DatabaseManager 现在实现 IDisposable 的示例。之前,using 语句会给你一个编译时错误,因为它没有实现它。

下面也被称为 a ,而不是完全是另一回事。_connectionfieldattribute

在开始在类型中实现 IDisposable 之前,请参阅实现 IDisposable 的正确方法,因为它永远不会引发异常。这是 Microsoft 对 Dispose 模式的看法,它是一个很好的清单,列出了该做什么和要避免什么。

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();
    }
}

评论

1赞 Tony Vitabile 3/3/2016
有关如何实现一次性模式的 MSDN 文章的链接很方便,而且我以前没有读过。