
C#にはガーベッジコレクション (GC) という仕組みがあり、使われなくなったオブジェクトを自動的に破棄してくれるおかげで、メモリの解放し忘れによるメモリリークといった煩わしい問題を解決してくれます。
とは言え、GC は GC が考える良きタイミングで解放処理を始めます。
自分が必要とするタイミングで解放処理を始めてくれるとは限りません。
(例えばファイルのオープン・クローズを繰り返す場合、クローズされてからでないと次のオープンができません)
明示的にリソースを解放する手段 (メソッド) はやはり必要です。
IDisposable インターフェース
IDisposable インターフェースは「使用後はリソース開放が必要」ということを表しています。
IDisposable インターフェースはDispose()というメソッドを1つだけ持っており、
IDisposable インターフェースを実装するクラスは、このDispose()メソッド内でリソースの解放処理を行います。
標準のクラスライブラリでリソース解放が必要なクラスは IDisposable インターフェースを持っています。このようなクラスを使う場合は使い終わったタイミングで Dispose() メソッドを呼ぶようにしましょう。
var sr = new StreamReader("text.csv"); try { // 何かしらの処理 } finally { sr.Dispose(); }
例外が発生した場合でも確実に解放処理が行われるように finally で Dispose() を呼ぶのが重要です。
using 構文
C#には Dispose() を自動で呼び出してくれる便利な using 構文というものがあります。
using のスコープから離れた(usingの{}から出た)時に自動的に Dispose() を呼び出してくれます。
もちろん例外が起きた場合にも対応しています。
以下のコードは上で書いた try ~ finally を使ったコードと同じように動作します。
using (var sr = new StreamReader("text.csv")) { // 何かしらの処理 }
IDisposable インターフェースを持つ複数のオブジェクトを使う場合、以下のように using を入れ子にして使う事も出来ます。
try { using (var sw = new StreamWriter("out.csv")) { using (var sr = new StreamReader("in.csv")) { // 何かしらの処理 } } } catch (Exception e) { // 例外処理 }
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください