5月13日「よくわからないアンマネージドリソース」
マネージドって何?
.NETでよくつかわれる、よくわからない言葉です。
ようは、.NETのメイン処理をやっている「共通言語ランタイム」というやつの管理下にあるものが「マネージド」、管理下にないものが「アンマネージド」と呼ばれるみたいです。
たまに「ド」がぬけて「マネージプログラム」みたいに言われてますが気にしないでください。
「マネージドプログラム」は.NETでつくられたプログラムのことです。
「マネージドヒープ」は共通言語ランタイムがわりあてるメモリ空間のことらしいです。
「マネージドオブジェクト」は「マネージドヒープ」からメモリをわりあてられたオブジェクトのこと……そんなかんじです。
逆に「アンマネージド」は.NETの管理下にないものを指します。
「アンマネージドプログラム」というのは.NET以外で書かれた、CやC++のプログラムのことみたいです。
「アンマネージドリソース」というのは.NETが割り当ててないリソースのことです。
ワタシは最初「ようは.NETでは使わないってことだろ?」くらいに思っていたのですが、
ファイルとかウインドウとかネットワーク接続とか、OSが受け持っているリソースは全部「アンマネージドリソース」らしいです。なんてこった。
アンマネージドリソースの種類
ワタシの分類ですがアンマネージドリソースとよばれるものには大きく分けて三種類くらいあるみたいです。
ひとつは「.NET API」でラップされたアンマネージドリソース。FileStreamとか普通に使われてるクラスですね。
もうひとつは「SafeHandle」というクラスをつかって自分でラップしたアンマネージドリソース。
さいごは生のウインドウAPIなどで直接作成したアンマネージドリソースです。
最後のやつはきっちり終了処理をしてリソースを解放しないと、アプリが終了してもリソースが使用中になってしまう危険性があるので、最初の2種を使うのが推奨されているようです。
最初の2種類は「ファイナライザー」といってオブジェクトが破棄される前に解放してくれる仕組みがあるので、最悪でもアプリを終了させればリソースは解放されるようになっているみたいです。
Disposeを使えというのは?
よかった。アンマネージドリソースは解放されるんですね。これですべて解決ですね。
でもこれだけだとまだプログラムとしてはよくないらしいんです。ようは、プログラム終了までつかみっぱなしにするな! と文句を言われてしまうのです。
ファイルは開いて、読んだらすぐ閉じる!
ネットワークはつないで通信したらすぐ閉じる!
Disposeというメソッドを呼んで「もう使わないので解放処理をしてくれ」ということを教えてやらないといけないらしいのです。
使ってすぐにDisposeできるものはこれでいいのですが、どうしても長い間使用したい場合は、終了時に必ずDisposeを呼んでやらないといけません。
お前もDisposeというメソッドを作れ! そこで自分の支配下にあるリソースは全部Disposeしろ! ということをやらないといけないらしいのですね。
これがまた色んな取り決めがあって面倒くさいんですよね……
IDisposableインターフェイスを実装した、Disposeパターン
Disposeというメソッドを作る場合、IDisposableというインターフェイスを実装するのが早道だということです。
さらに「Disposeパターン」と呼ばれてるお約束のコードを書くべき、らしいのですね。
これは正直、さっきでてきた最後の「アンマネージドリソース」がなければ適当でもいいみたいなのですが、最後の「アンマネージドリソース」をひとつでも保持しているならキチンとやるべきものみたいですね。
たぶん、この解釈であっていると思うんですが、もうちょっと調べてみます。
以上、ここまで読んでいただいて、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?