IDisposable 是否总是需要处理掉?

Does IDisposable always have to be disposed?

我有一个 class,其中包含受保护的 IDbConnection 属性。在这个 class 中,我有一个函数可以 return 打开 IDbConnection。因此,我认为 class 也应该实施 IDisposable class 以确保 IDbConnection 得到正确处理。

这就是我的 class 的样子 -

public class MyConnection : IDisposable
{
    protected IDbConnection _connection;
    protected string _connectionString;

    public IDbConnection OpenConnection()
    {
        _connection = new SqlConnection(_connectionString);
        _connection.Open();
        return _connection;
    }

    public void Dispose()
    {
        if(_connection != null)
        {
            _connection.Dispose();
        }
    }
}

我的使用方式是-

MyConnection mc = new MyConnection();

using(var cnn = mc.OpenConnection())
{
    // do stuff with cnn
}

这应该处理连接完成后的处理。关于这个的几个问题 -

  1. IDisposable 继承对于 MyConnection 是必要的吗?我的想法是,这只是最佳实践,因为您可能会在 class 控件之外打开连接。
  2. 如果需要 IDisposable,我是否应该像这样使用它 -

处理掉两者

using(var mc = new MyConnection())
{
    using(var cnn = mc.OpenConnection())
    {
        // do stuff
    }
}

正如评论中所指出的那样,您所拥有的应该命名为 MyConnectionFactory,因为它就是这样做的。

由于您要返回连接,因此需要处理的是连接,而不是工厂本身。所以你的用例

MyConnectionFactory mc = new MyConnectionFactory();

using(var cnn = mc.OpenConnection())
{
    // do stuff with cnn
}

是正确的方法。处置 mc 在这里没有任何用处,因为它处置了 实际上已经处置的成员。您甚至应该从 class 中删除成员 _connection,因为它并不能真正帮助您保留它,因为调用者会清理它。也就是说,除非您想保持连接打开,否则调用方 绝不能 处理它。