クラス内でIDisposableリソースを共有するにはどうすればよいですか?
-
06-07-2019 - |
質問
SQLiteデータベース間でデータを移動するためのコンソールアプリケーションを作成しています。接続のクラスとさまざまな準備されたステートメントがIDisposableであるため、次のように using
ブロックを使用してこれらのオブジェクトをインスタンス化します:
using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
{
sqlite_conn.Open();
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
sqlite_cmd.Connection = sqlite_conn;
sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
sqlite_cmd.ExecuteNonQuery();
}
sqlite_conn.Close();
}
しかし、これらの接続を1つのメソッドで作成し、それらを他のメソッドで呼び出す必要があります。これらの接続をインスタンス変数として保存する最もクリーンで混乱の少ない方法は何ですか?それらの .Dispose()
メソッドがインテリジェントな方法で呼び出されることを確認したいが、すべてのアクションが単一ののコンテキスト内で発生することを確認する良い方法を見つけることができない使用
ブロック。
これはC#newbの質問であることがわかっているので、回答をそのように調整してください。提案された解決策がある場合、説明のためにコードサンプルを含めていただければ幸いです。
編集:私のユースケースはコンソールアプリです。誰かがソースと宛先の接続文字列を渡し、コンソールアプリが操作を実行します。実際にコンソールクラスProgram自体にこのようなIDisposableを実装させますか?:
class Program : IDisposable
{
private SQLiteConnection sourceConnection;
private SQLiteConnection destinationConnection;
public void Dispose()
{
sourceConnection.Dispose();
destinationConnection.Dispose();
}
}
解決
これらの接続を1つのメソッドで作成し、それらを他のメソッドで呼び出す必要があります。これらの接続をインスタンス変数として保存する最もクリーンで混乱の少ない方法は何ですか?
この場合、これらのインスタンス変数を保持するクラス自体がIDisposableを実装する必要があり、廃棄時には接続も確実に破棄する必要があります。
また、一度に複数のIDisposableがある場合は、このように書き換えてグループ化し、コード内のネストを減らすことができます:
using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
sqlite_conn.Open();
sqlite_cmd.Connection = sqlite_conn;
sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
sqlite_cmd.ExecuteNonQuery();
} // no need to call .Close(): IDisposable normally handles it for you
他のヒント
クラスにIDisposableを実装させ、Disposeメソッド内で接続などをクリーンアップすることができます。その後、クラスを呼び出すメソッドは(MyClass c ...)を使用して実行できます。
1つの方法は、クラスにIDisposableを実装させることです。クラスのDisposeメソッドで、接続およびコマンドなどのDisposeメソッドを呼び出します。その後、usingブロックでクラスのインスタンスを使用できます。