SATOXのシテオク日記

~ふもっふ、ふもふも~

C#というか.NETはエラかった

.NET Framework 1.1のC++/CLIから始め、2.0 C++/CLIC#と遷移してアプリケーションを作ったりしてきましたが、C#というか.NET Frameworkはエラいなぁという事を最近やっと実感してきました。
C#なんてマイクロソフトが勝手に作った仕様で、「そんなんには流されないぜ」と半ばやさぐれていましたが、使ってみるとその良さに気づいてくるわけです。いやー、実はエライ。
SATOXが「これは」と思う2つのすごいところは以下の2点です。

Cで言うところのmallocに対しては必ずfreeでメモリを解放しないと行けませんが、明示的に行う必要があります。記述を忘れたり、途中で予期せぬハングアップなどをしてしまうとアプリケーションがメモリ未解放のままとなります。C++でもnewに対するdeleteも同様。
.NET Frameworkではメモリに対してもクラスのインスタンスのように参照カウンタがあり、不要になった時点で解放される仕組みです。正確には不要になってもその瞬間は解放されず、いわゆるガベージコレクション(GC)のタイミングでメモリが整理されるわけです。
また、C/C++のように、あるヒープ領域に直にマッピングされるわけではなく動的に扱うことが出来るため、インスタンスの実体もガベージコレクトされます。具体的にはポインタでクラスオブジェクトやメモリを扱えないようになっているわけです。
■クラスインスタンスの動的生成(.NET Framework)
これはちょっとすごいと思いました。
クラスのインスタンスを動的に生成することができるんです。これはひっくり返ってもCやC++ではマネの出来ない事です。
例えば、あるダイナミックリンクライブラリ(DLL)の中にクラスが定義されていて扱われているとします。このクラスオブジェクトを実行体(EXE)側に渡そうとする場合、少なくともEXE側にも同じクラスの定義(例えばヘッダのインクルード)が必要になるわけです。
しかしながら、.NET Frameworkこんな事をする必要がありません。それどころか、まったく知らないクラスをインスタンス化して扱うことも出来ちゃうわけです。
この仕掛けは動的アセンブリにあります。.NET Frameworkでは、クラスのアセンブリを動的に検索することが出来ます。そしてアセンブリからクラスオブジェクトを生成することが出来るのです。さらに、そのクラスにはどんなプロパティ、メソッド、変数があるのかなどを動的に調べたり呼び出したりすることが出来ます。これってものすごいことだと思いませんか?
この仕組みがあることでオブジェクトのシリアライズ、デシリアライズ(例えばXMLファイルからオブジェクトが出来る)などが実現可能なわけです。
その他
その他にはC#は洗練されていてスマート。原則、.NETのAPIしか使えません。
………と、このすばらしさが分からない方はちょっと素人。
一方、C++/CLIはある意味最強であり、最低の環境です。
Cのライブラリがリンクできるのはもちろん、STLDirectX(Pure)、.NETなんでもありです。つまり.NET Framework以外のお作法を混在して開発することが許されているため、newやmallocが使えるし、簡単にスパゲティコードが書けてしまいます。
昔のブログの記事を見てるとC++/CLI、C#に対するSATOXの心の推移が見て取れて面白いものです。やっぱC#ですよ(笑)。