誰かが推奨した以前の質問への回答で:
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("...")) { }
これは、接続が必要な個別のメソッド本体で使用するよりも効率的/優れていますか?