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

本文关键字:对象 SqlConnecions 字段 于使用 是否 如果 | 更新日期: 2023-09-27 18:37:13

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

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

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

如果我理解正确的话,DatabaseManager类用于using语句内部,因此它必须实现IDisposable,因此具有自己的Dispose方法。

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

它可以,

但你必须编写代码来做到这一点。下面是数据库管理器现在实现 IDisposable 的示例。在 using 语句之前会给你一个编译时错误,因为它没有实现它。

下面的_connection也叫field,而不是完全是别的attribute

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

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