4

在回答上一个问题时,有人建议:

让 SqlConnection 成为您的类的成员变量,但使类 IDisposable 并在处置该类时处置 SqlConnection

我已经整理了这个建议的实现(如下),但想检查这个实现是否正确(显然它目前除了打开连接之外没有做任何事情,但想法是那里会有使用连接的方法并且能够依赖它的存在和开放)。

public class DatabaseRecord : IDisposable
{
    protected SqlConnection connection;

    public DatabaseRecord()
    {
        connection = new SqlConnection("ConnectionString");
        connection.Open();
    }

    // IDisposable implementation

    private bool disposed;
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }


    private void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                connection.Dispose();
            }
            disposed = true;
        }

    }

    // Destructor
    ~DatabaseRecord()
    {
        Dispose(false);
    }
}

这行得通吗?使用 DatabaseRecord 实例的类是否需要做任何特殊的事情,或者一旦不再使用/引用实例,会自动调用 Dispose 吗?这是否比using (var connection = new SqlConnection("...")) { }在需要连接的每个单独的方法体中使用更有效/更好?

4

4 回答 4

5

SqlConnection 是一个托管资源,应该在if (disposing)块内进行处理。使用你的类的类应该处理它,最好用一个using块。这是否优于usingSqlConnections 的单个块将取决于此类的其他方法以及它们的使用方式。

于 2010-01-07T13:38:11.703 回答
3

我看到的所有建议都说DbConnections 应该保留最少的时间,所以我希望在我正在审查的代码中看到的格式是

using (var connection = new SqlConnection("...")) { ... }
于 2010-01-07T13:51:33.610 回答
2

connection.Dispose()应该移动到if (disposing) { ... }块。Close()不需要调用,因为Dispose()打开连接时会关闭连接。

于 2010-01-07T13:44:16.153 回答
1

这将起作用,并且比多个 using 语句更有效。使用 DatabaseRecord 类的代码可以在 using 语句中执行此操作,以便在它离开循环时自动清理那里。

然而,一项建议是在 Dispose 方法中检查 Connection 对象的状态,如果它在调用 dispose 之前仍然打开,则将其关闭。

于 2010-01-07T13:32:21.683 回答