kahoの日記: C#
最近Windowsで動くプログラムをつくらなければならない羽目になり,VisualStudio2005を使用している.
最初はC++で書かれたアルゴリズムパートにGUIの皮をかぶせればよいと思っていたのだが,CLI上のC++はもはやC++とは別物であり,とても使用に堪えない複雑性になっていた.
時間のかかるプロセスなので途中でモニタリングさせたかったのだが,関数ポインタを渡すことができなかったり,その他にもポインタと参照との混乱,STLとGenericの混合などちょっと手に負えなくなって来るのでgcc用のコマンドラインのプログラムをC++/CLIで動かすのはやめることにした.System::Stringとchar*の変換だけでも嫌になってくるし.
このためついにC#に手を出すことになったのだが,作法は殆どJavaと同じなので全て書き直しになるとしてもこちらの方がはるかに楽だ.
LinuxやMacでもMonoが使えるのでアルゴリズムに関してはそちらで実装し,GUIをVSでということができる.
Monoは以前はひどい効率だったようだが,私のプログラムではC++と比較して1/2から1/3程度で致命的というほどではない.
Javaと比べて良いところはプロパティが使えることとコンパイラとアプリケーションの起動速度がjavacより速いことだ.
ただしいくつか難点もある.
全く原因が分からないのだが,VSでビルドしたプログラムで,メソッドの内部で多数の配列を確保して,内部に多数のelse if節を含む場合,そのメソッドの呼び出しの引数がメソッドを呼び出された時点で書き変わるという現象に見舞われた.これはcscでコマンドライン用にビルドしたらちゃんと動いたのでとても奇妙だ.再現性のある短いコードもできず,ただのプログラムのバグなのかもっと意味があるのかも分からなかった.
これは結局一部を配列ではなく自動変数として確保することで回避した.
あと,これはMonoの実装の問題なのかもしれないが,せっかくC#の機能の多次元配列を使うと遅くなるのが残念だ.
文法的にはクラス定義を複数のファイルに置けたりすることや,演算子の多重定義はやめておいた方がよかったと思う.まだ今のうちはいいが,プログラムの規模が大きくなるときっと破綻するプロジェクトが出てくるだろう.
一ユーザーとしてはMonoがMacでもWinformをサポートし,JavaとC#の相互変換が簡単にできるようになったらもっと積極的に使いたい.
自作のプログラムは最近Python, D, C++, Cの順で多くてJavaは最近使っていなかったのだが,Windowsユーザー用に使われることを考える必要がある場合は第一の選択肢になるだろう.
C# More ログイン