なんとなくC#とかはじめてみたわけ

今日もいいお天気。布団とか干してみる。

で、3時からバイト。お客さん少なく平和。平日ですから。で、時間ができたのでこないだ言われてたコンピュータ書の並び替え。うーん、微妙な並びだ。

春休みになって時間ができたので、なんとなくC#をはじめてみたわけ。

クラス定義の仕方とかどうみてもJavaですが、OSに依存しない.NET構想は残念ながらWindows以外では流行らず実質的にWindowsアプリ開発言語になってしまってるという罠。WindowsアプリならC#じゃなくてもC/C++VBでも作れるけど、Microsoft的にはC#を推奨してるっぽい。てゆーかドキュメントがC#ばっかりなのは嫌がらせ。特にVC++では昔ながらのWin32APIを用いたネイティブアプリは問題ないけど.NETアプリとなるとC++のマネージ拡張C++/CLIとか出てくるわけで。マネージコードを書くにはgcnewとかカレットとかごちゃごちゃしてる感は否めない。いや、慣れればまったく問題ないと言われればそれまでなんやけど。なんか気持ち悪い。そんなこんなでMicrosoftの圧力により(?)C#は無視できなくなってきてるわけです。

C++使いとしてはC#でうれしいのはガベージコレクションJavaに慣れてしまうとC++が怖くなるというのはわかる。C++は効率を最優先して進化してきた言語なので、ガベージコレクションなんて高価なもんはないんやけど、コンパイルオプションとかでサポートしてくれへんかなぁとかちと思ったり。

あと特徴的なのはプロパティ。privateフィールドを見かけ上publicにしつつ、アクセスはメソッド経由。なくてもいいけど、あると簡潔に書ける。C#は簡潔さっていうのがひとつのポイントじゃないかと。

もうひとつ特徴的なのはイベント。C#ではイベントを言語レベルでサポートしてる。MFCによる職人技な芸術的マクロではなく、すっきり表現できるようにということだろう。

C#2.0からGenericsもサポート。GenericsとはC++でいうところのtemplate。型を抽象化する。Genericsはいるだろう。これなかったらコレクション使う度にキャストの嵐になってまうし。今までサポートされてなかったことの方が不思議。C#Genericsは型パラメータに継承関係の制約式が書ける。C++にも制約式欲しいなぁ。

C#であとおもしろいのクラス階層。すべての型はSystem.Objectから派生してるという純粋オブジェクト指向な階層構造で、プリミティブ型のように見えているintとかdoubleとかは実は.NETで定義されてる構造体のエイリアスとして定義されてる。つまりintとかも実はクラスみたいな扱いでObject型から派生してる。これはJavaが実行速度の観点からプリミティブだけを別扱いして純粋オブジェクト指向が破綻した反省を踏まえてやと思う。そこまではいい。でも、C#でも効率はやっぱり無視できなくて、構造体は値型でスタックに配置され、クラスは参照型でヒープに配置される。となると、値型の構造体を参照型のObject型に変換できねーじゃんという矛盾が発生してくるわけ。で、どうするかというと、ボクシングという変換処理を裏でこっそりしてる。で、表向きは美しいクラス階層を保つ。すごいというべきか。苦肉の策というべきか。でも値型と参照型を分けてしまった時点で、既に純粋オブジェクト指向は破綻してる気がするんですが。そのへんどうなんでしょう。なんか中途半端。文法上は全部デフォルトで参照型にしてしまって、内部でこっそりスタック使うとかダメ?なんでこんな仕様になったのか。ちなみにネイティブなdllにintとか引数を渡そうとすると、.NET側からはintは単純な値ではなく、実際には構造体やから、間で変換処理してるとかなんとかちょっと非効率。DirectXとかC#で使おうとすると結構なコストがかかりそうな気がするんやけど、そのへんはどうなってるのやら。