2016年7月8日金曜日

[C#]「IDisposable」と「using」

こんにちは。明月です。
前の投稿までFileシステムについて勉強しました。少し勉強順番が悪くなりましたが、今日は「C#」の文法の「using」と「IDisposable」のインターフェースについて勉強します。


IDisposable


「IDisposable」のインターフェースは「Dispose」のメソッドを抽象してコネクションと関係あるクラスに継承して「Dispose」(解除)メソッドを実装させるようことです。すなわち、FileStreamと通信、データベース連携等のクラスレベルでリソースを解除するためにDisposeメソッドを実装することです。


MSDNリンク - IDisposable インターフェイス





上の例は「Dispose」メソッドでリソースを解除しなく、他のストリームで同じリソースのコネクションを取得するようにしてエラーを発生することを実装したことです。
すなわち、データを作成するリソースのコネクションを取得してリソースを解除しない状況で読み込むためにコネクションを取得するように実装したのでエラーが発生したことです。




リソースを取得~解除の規則はC#だけではなく全てのプログラム言語にも同じ規則です。それでリソースを取得する時には必ず解除しますという構造をちゃんと認識するべきです。


今まで勉強したとおりに簡単なプログラムな作成する時にはリソース取得、解除がそんなに難しくないです。しかし大きいプログラムからはリソース返却するロジックはそんなに簡単ではありません。


using


「using」はソースの一番上端で「namespace」を宣言する時に使うキーワードです。でも、「.NetFramewor3.5」から「IDisposable」インターフェースを継承しているクラスに囲まれていれば処理が終わる時期に「Dispose」メソッドを呼び出す機能もあります。



上のコンストラクタをみると最後にTextWriterタイプのオブジェクトは「Dispose」のメソッドを呼び出して解除しましたが、中のFileStream、BufferedStreamのストリームは解除することが大変になっています。




今まで「IDisposable」と「using」の関係について勉強しました。「using」と「IDisposable」はJavaの「try」と「IClosable」の関係と同じですね。
「using」〜「IDisposable」はプログラムの性能とは関係ないですが、リソース管理をしやすく処理して生産性を上がられるキーワードだと思うのでちゃんと勉強したほうがプログラムを開発する時に良いと思います。

0 件のコメント