@IT:特集 C# 2.0 新機能徹底解説後編

特集 C# 2.0新機能徹底解説(後編) ― 進化したC# 2.0の状態管理、匿名メソッドとイテレータ(1/4) - @IT

ちょっと IL を出しすぎな気がする。
自動生成されるクラス名がコンパイル通らないとかどうでもよいことは触れないで、クラス名なんて適当な意味がある単語...AnonImplとか...にして擬似コードだけで進めてもいいんじゃないかと思った。
全体的にしっかりしているので、.NET 関係で C# で開発している人は1度は読んでおくと良いと思います。


しかし、このタイトルでこの内容、かなり期待はずれに感じる人が多いんじゃなかろうか。
特に前編の内容で C# 2.0 に興味を持った人にとって、後編の内容は IL や裏の実装に関する解説が主体で、イテレータや匿名メソッドに関する解説がほとんどないに等しく、裏で動く実装の話ばかりというのは辛いだろう。

意図を伝える

プログラミングとは、コンパイラ等の通訳さんを通じて、コンピュータと人間が会話することである。
なんて誰も言ってないと思うが、
プログラミング言語を操ってプログラムを組むというのは、多少そんな意味あいがあるように感じることは少なくはない。

しかし、コンパイラが意味を理解しているということについての再認識は重要だ。後処理が必要だということは、プログラム・コードにその意味を込めて適切にtry/finally文やusing文を実装しなければならない。
後処理のコードを書いていても、try/finally文で後処理だという意味を適切に与えなければ、当然、コンパイラにはその意味を理解してもらえない。
プログラマがコードに込めた意味が足りなければ、コンパイラは意味をくみ取れずに、足りない意味に沿ったコードが生まれるのである。

このあたりは、現在でも Java .NET の違いとして表面化している。
プログラム言語は、プログラマがコンピュータに対して意図を表現するための手段であるとすると、従来の Native Code を出力する C++ 等のコンパイラJavaバイトコードを出力するような Java コンパイラは、相手……つまりコンピュータに意図が通じればよいと、多くの最適化を行ってくれる場合がある。
これに対して .NET では各種対応プログラム言語のコンパイラは IL が Native Code に変換される際の最適化をある程度期待して、高度な最適化を行う必要は必ずしもない。出力される IL は、まだプログラマの意図を表現した第二の言語であり、JIT コンパイラによって再び翻訳されるべき存在なのである。

これは、プログラムを組む場合の記述方法としてある程度の影響がでてくる。
前述の記事における try - finally による意図伝達と同様に、プログラムの書き方によって最終的な出力に大きな影響を与えうることを多少は考慮するのも悪くない。

たとえば、

現状の .NET 環境における C# 1.2 において、上記のようなプログラムの書き方とはどのようなものがあるだろうか?
たとえば、限定的な分岐を記述する際に、極力 switch-case 文を多用することが相当する。

状態をもったステートオブジェクトを作るとか、仮想関数でポリモーフィズムを採用するとか、デリゲートを登録して使いわけるとか、処理を分岐させる方法は様々ではあるが、終了処理を記述するのに try-finally を利用するように、列挙を while ではなく foreach で記述するように、分岐先が限定的である場合の実装は switch-case を採用できるような設計を検討してみてはどうだろうか。