オブジェクトの破棄を保証する
スポンサーリンク
プログラム中で、アンマネージ リソースなどを扱う場合はリソースを解放する必要があります。破棄には Dispose メソッド、Close メソッドがある場合は Close メソッドを使用します。必要なくなった時点で破棄すれば良いわけですが、何らかの原因で例外が発生した場合を考えると安易に実装できません。ここでは、オブジェクトの破棄を保証するための方法を紹介します。
サンプルコード
以下にサンプルコードを示します。
最初に Dispose メソッドだけが用意されている場合の例です。J# (Java) は using ステートメントはサポートしていないため、try ~ finally を使用して保証します。
J# 全般
// ブロックの外で変数を宣言する
Form1 cForm1 = null;
// cForm1 が破棄されることを保証するために try ~ finally を使用する
try {
cForm1 = new Form1();
cForm1.ShowDialog();
} finally {
// cForm1 を破棄する
if (cForm1 != null) {
cForm1.Dispose();
}
}
次に Connection 系などに多い、Close メソッド、Dispose メソッドの双方が実装されている場合の例です。Open メソッドに対して Close メソッドがあるため、Open メソッドの後で Finally を実装することになります。もちろん、Connection 以外に Command、DataAdapter、DataReader などを使用した場合は中でネストすることになります。(ここでは説明を省いています) J# でも、try ~ finally の 2 段構えになります。
J# 全般
// ブロックの外で変数を宣言する
System.Data.SqlClient.SqlConnection cSqlConnection = null;
// cSqlConnection が破棄されることを保証するために try ~ finally を使用する
try {
cSqlConnection = new System.Data.SqlClient.SqlConnection("...省略...");
cSqlConnection.Open();
// cSqlConnection が閉じられることを保証するために try ~ finally を使用する
try {
//
// ここで cSqlConnection を使用する
//
} finally {
// cSqlConnection を閉じる
if (cSqlConnection != null) {
cSqlConnection.Close();
}
}
} finally {
// cSqlConnection を破棄する
if (cSqlConnection != null) {
cSqlConnection.Dispose();
}
}
次に Stream 系などに多い、Close メソッド、Dispose メソッドの双方が実装されているものの、Dispose メソッドが Protected などで隠蔽化されている場合の例です。J# は using ステートメントがサポートされていないため、以下のように System.IDisposable インターフェイスから隠蔽化された Dispose メソッドを呼び出します。
J# 全般
// ブロックの外で変数を宣言する
System.IO.StreamReader cReader = null;
// cReader が破棄されることを保証するために try ~ finally を使用する
try {
cReader = new System.IO.StreamReader("C:\\Hoge.txt", System.Text.Encoding.Default);
// cReader が閉じられることを保証するために try ~ finally を使用する
try {
//
// ここで cReader を使用する
//
} finally {
// cReader を閉じる
if (cReader != null) {
cReader.Close();
}
}
} finally {
// cReader を破棄する
if (cReader != null) {
// Dispose メソッドが隠蔽化されているため IDisposable から呼び出す
System.IDisposable cDisposable = cReader;
cDisposable.Dispose();
}
}
関連するリファレンス
準備中です。
