C#(.NET) を使って良かったと思える点

せっかくなので忘れないうちに C# .NET 開発で感じた点をまとめておきたいと思います。
(事実誤認に基づく誤解もあると思いますので、ツッコミ入れて頂けると嬉しいです)

WindowsForms は vcl ととてもよく似ているような気がする

Form の上にボタン等を載せてイベントハンドラを実装して…というポトペタな RAD スタイルはほとんど一緒です。(もっともこのスタイルは VisualBasic が最初なんでしたっけ…)

VisualStudio2005 の Intelli sense の補完が強力過ぎる

メソッドの補完なら C++ でもおなじみでしたが、クラスのメンバやスコープ内の変数まであらゆるものが補完対象に入っています。
C# で一通り書いた後に C++ に戻ると不便に感じてしまい、すっかり自分が堕落している事に気付かされます(笑)。

ref や out キーワードは呼び出し側にも強制される

引数に渡した変数が変更されるのかどうか、初期化の必要があるのかどうか(out は不要)が明確になるためソースが読み易くなります。これは実に良いアイデアだと思います。

プロパティの set / get を使ってまとめて書けるのがよい

C++ でも setHogeHoge() と getHogeHoge() の羅列をよく書くのでこれを知った時は関心しました。

COM との親和性がやたら高い

C++ では CoCreateInstance() と書く所がただの new で済んだり、QueryInterface() が as 演算子のキャストで済んだりと、楽過ぎて涙が出そうです。

Managed/Native 混合デバッグ

VisualStudio のデバッガ設定ではデバッグする箇所を Managed か Native かのいずれかを選択することができます。ここで「混合」を選ぶと両方でトレースやブレークポイント等が有効になるので、COM のメソッド呼び出しでパラメータ受け渡しがうまくいってるかどうかの確認でかなりお世話になりました。(もっとも、それ以外の場面ではデバッガの速度が落ちるだけなので、どちらか片方にしておいた方が無難です)

DirectShowNet library*1のデキがいい

DirectShow を C# から使うライブラリです。DirectShow の全ての API が実装・テストされている訳ではないそうですが、ムービー再生やキャプチャ等でグラフを作る程度であれば、全然問題ありませんでした。
専用のドキュメントも特にありませんが、クラス名やメソッド名は本家の DirectShow に準じており、その使い方もサンプルを見ればだいたいわかります。素の DirectShow では #define された定数の羅列も、ちゃんと enum にまとめられていて見つけやすいです。*2
また、サンプルプログラムのアーカイブに入っている、Samples\Misc\Toolkit\FilterGraphTools.cs がかなり使えます。

  • ConnectFilters(): フィルタのピンを名前を指定して接続する
  • HasPropertyPages(): プロパティページがあるかどうか確認する
  • ShowFilterPropertyPage(): プロパティページを表示する

など、よく使われる処理がまとめられています。
いずれも、もともとヘルプのサンプルコードにある内容なので、それを見ながらコピペしても全く問題ありません。が、関数にまとまっているものが動作確認済みの状態で既にあるなら、それを使わない手はありません。

*1:ソースアーカイブのファイル名がなぜか DirectShowLibs になってますが…

*2:ただし、大文字小文字の命名ルールが多少変わっているようです