Landscape トップページ | < 前の日 2004-12-20 2004-12-21 次の日 2004-12-22 >

Landscape - エンジニアのメモ 2004-12-21

C# の using ステートメントによる Dispose()


* C# の using ステートメントによる Dispose()

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [C#] [.net]

C# で using ステートメントを使うと、ステートメント終了時にオブジェクトの Dispose() を保証できる。

- アンマネージリソースは明示的に解放しなければならない

マネージリソースであればガベージコレクタが解放してくれる。しかし、データベースコネクションやファイルハンドルなど、アンマネージなリソースは使い終わったら Close() や Dispose() などで明示的に解放する必要がある。解放を怠るとリソースが枯渇してしまうおそれがある。

アンマネージリソースを使う場合、try finally ブロックを作って解放処理が必ず実行されるようにするのが基本。
SqlConnection con = new SqlConnection(DBConnectionString);
con.Open();
try {
    // DB アクセスなどの処理
} finally {
    con.Close();
}

C# では using ステートメントを使って以下のように書くことができる。
using (SqlConnection con = new SqlConnection(DBConnectionString)) {
    con.Open();
    // DB アクセスなどの処理
}

using ステートメント
http://www.microsoft.com/japan/msdn/library/ja/csref/html/vc ...
using ステートメントでインスタンスを作成して、using ステートメントの終了時に Dispose メソッドが呼び出されることを保証します。using ステートメントが終了するのは、using ステートメントの末尾に到達したときか、例外がスローされたなどの理由で、ステートメントの末尾に到達する前に制御がステートメント ブロックを離れたときです。

インスタンスを作成するオブジェクトには、System.IDisposable インターフェイスが実装されている必要があります。

MS の文書にもあるとおり、using ステートメントは IDisposable インターフェイス が実装されているオブジェクトでのみ利用できる。アンマネージリソースを扱うクラスを書いたときには、IDisposable インターフェイスを実装しておくと良い。せっかくシンタックスシュガーが用意されてるんだから、使わない手はない。

- using エイリアスや using ディレクティブとは別物

名前空間についての記述である using ディレクティブとは別物。
using System.Data; // これとは別物

using ディレクティブ
http://www.microsoft.com/japan/msdn/library/ja/csref/html/vc ...
名前空間のエイリアスを作成する場合 (using エイリアス)。
名前空間で型の使用を許可する場合。これにより、その名前空間内では、型を修飾しないで使用できます (using ディレクティブ)。

初めて using ステートメントを見たときは、なんでこんなところで名前空間を操作してるんだ? と疑問に思ったものだ。

- using ステートメントを使うと何がうれしいのか

解放のための finally を書かなくて良い。
アンマネージリソースの解放忘れを防止できる。アンマネージリソースを割り当てたとき、漏れなく解放しているかどうかソースをチェックするのは手間がかかる。using ステートメントなら割り当てるコードと一体化しているので漏れが無くなる。

オブジェクトのスコープがはっきりする。
これは人によってはそう思わないかもしれない。
VS.NET を使っていると using ステートメントを使うとインデントが付く。多重ループや深い条件分岐などでインデントが深いコードというのは非常に可読性が悪いとされる。私もインデントの深いコードには近寄りたくない。しかし、なぜか私は using によるインデントは気にならない。オブジェクトのライフタイムを端的に表すインデントだからだろうか?

- using をまとめて書く

using はまとめて書くことができる。後に書いた物ほど先に解放される。
using ( ... )
using ( ... )
using ( ... ) {

}

複数のアンマネージリソースを割り当てるときなどは便利。

- using を使った DB トランザクションのテンプレート

私がデータベーストランザクションを実行するときのテンプレート。実際には SqlCommand クラスとか DataAdapter を使ったりするけど基本はこれ。

using (SqlConnection con = new SqlConnection(DBConnectionString)) {
    con.Open();
    using (SqlTransaction tran = con.BeginTransaction(IsolationLevel.Serializable)) {
        try {
            // データベーストランザクションを実行
            tran.Commit();
        } catch {
            tran.Rollback();
            throw;
        }
    }
}

上記コードをテンプレートとして使ってはいるが、私はこのコードに疑問を持っている。それについてはまた後日。

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。