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ブロックを使用してクラスを破棄する必要があります。usingこれがSqlConnectionsの個々のブロックよりも優れているかどうかは、このクラスの他のメソッドとそれらの使用方法によって異なります。

于 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 ステートメント内でこれを行うことができ、ループを離れるときにそこで自動的にクリーンアップされます。

ただし、1 つの推奨事項は、Dispose メソッドで Connection オブジェクトの状態を確認し、まだ開いている場合は dispose を呼び出す前に閉じることです。

于 2010-01-07T13:32:21.683 に答える