using構文の使い方
About
サンプルプログラムなどを見つけたとき、「using文」が含まれることがあります。やっていることは分かるのですが、プログラミング初心者の私には何のために利用されているものか分かりませんでした。ここではusing文について言及します。
ガーベージコレクションとリソースの解放
C#(.Netframework)はガーベージコレクションが動作する言語(環境)です。ガーベージコレクションを端的に説明すると、実行するプログラムの不要になったメモリ領域を自動的に回収(開放)する機能です。ガーベージコレクションによって、プログラマはメモリ管理を意識することなくプログラミングすることができます。
ところがプログラム中で利用する一部のリソースについては、他のアプリケーションやOSの操作によって利用されるかもしれません。つまり他のアプリケーションやOSの操作が、プログラム中で利用するリソースを利用したい場合に、既にプログラム中で利用しているので一切の操作を受け付けなくなるかも知れないわけです。そこでガーベージコレクションによるリソースの解放を待つことなく、対象のリソースをプログラマが解放してやる必要があります。
あるいはガーベージコレクションが、対象のリソースをプログラム中に不要なリソースとして判断しないこともあるでしょう。
using構文
using構文を端的に説明すると、IDisposableインターフェースを実装するクラスのメソッドDisposeを文の最後に実行する、という構文です。ではIDisposableクラスとは、Disposeメソッドとは何かについても説明する必要があります。
IDisposableメソッドは、Disposeメソッドの実装を定義するインターフェースです。端的にいえば、IDisposableインターフェースが与えられるクラスにはすべてDisposeメソッドが実装されています。Disposeメソッドは、そのクラスが利用しているリソースを任意のタイミングで開放する処理が実行されるメソッドです。またDisposeメソッドを実装する場合にはそのように実装されるべきです。
先のガーベージコレクションとは異なり、ユーザが任意のタイミングでDisposeメソッドを実行すれば、そのクラスのインスタンスで利用されている全てのリソースが解放されます。これは例えば特定のファイルへの参照やストリーム(Stream)が該当します。
ここでusing構文に戻ります。using構文は、その中で定義される処理の最後に、IDispasable.Disposeメソッドを実行するための構文です。例えば次のように実装されている場合、処理の最後にXXXStreamに実装されたDisposeメソッドが実行され、XXXStreamで利用されていたリソースが解放されます。
using(XXXStream stream = XXXStream(xxx)) { ストリームを利用した処理 }
とどのつまり必ずリソースの解放を実行するわけです。Disposeメソッドを手動で実行することによっても同じ結果が得られますが、プログラマが忘れないように、解放されるべきリソースであることを明示する意味でusing構文は大いに役に立つと思われます。
using構文の引数に与えられるクラスには、IDisposableインターフェースが実装されている必要があります。