著作一覧 |
拡張メソッドとstatic import。
どっちも外部のstaticメソッドをあたかもあらかじめthisに結合しているかのように記述できる。
でも、static importはimportしたクラスの記述にのみ影響。拡張メソッドは引数で指定したthisに影響。その意味では拡張メソッドのほうが応用がきく(というよりも応用例が先にあってそれを実現するために考えられたようだ)。
どちらもmixinのように見えるが、インスタンスの内部に入り込むのではなく外部操作を与えるだけなので少なくてもRubyのmixinとは異なる(mixinの定義次第ではある)。
どうやってLINQを実装するか、というヘルスバーグのセッションがおもしろかった。
最初にLINQ構文があって、それを実現するために.NET Framework2.0を変更せずにコンパイラの変更だけで済ませる。
導入したのは
・無名タイプ
・オブジェクト初期化構文(一見Javaのイニシャライザみたいだが、インスタンス生成後に実行されることと、外部からのnew呼び出しでの記述となる点が異なる)
・型推論(式から求められる型=無名型をそのスコープで有効な型として扱う−インテリセンス対象になるのだから編集時にも見ている?)
・ラムダ式(デリゲートに変換される)−クロージャの例も示していたがrefを利用したとしてもスタックが畳まれた後も生き残るのだから、値型については実際にはrefではなくコピーが取り込まれるのだと思う)
・拡張メソッド(外部のstaticメソッドをthisのメソッドルックアップの対象として組み込む)
特に無名タイプというのは、猛烈に便利そうな機構だと思った。
大前提としての強型付け(=Visual Studioでインテリセンスが有効であること。と、コンパイル時の名前解決とは言わなかったがこれが重要なのは多分合っていると思う)を生かすための無名タイプのコンパイル時(編集時?)生成というのがキモに見えた。
とにかくヘルスバーグはプレゼンがむちゃくちゃにうまい。スライドの内容を暗記しているのはもちろんのこと(だからスクリーンに映されているのは日本語版。一箇所資料の左右を間違えて説明した箇所があったが途中で気づいて言い直した)、緩急自在、立ち居振る舞い、トピック切り替えのタイミングなど。プレゼンってのもデザインなのであるな、と思った。
#そうか、無名クラスと呼ぶとJavaの無名クラスのように見えるが、LINQの場合結果セットを格納するためのオブジェクトで、メソッドのセットを作るためのJavaの無名クラスとは目的が異なるから、無名タイプと呼ぶのかも。
ジェズイットを見習え |
う、ヘルスバーグ、面白かったですか…<br>行けばよかったなぁ。<br><br>知ってる話題が多かったし、ヘルスバーグの話の為だけに横浜も遠いかなぁ、と思って流したのですが。
PDCでのC#3.0の拡張を追っていれば目新しい話題ということはないと思います(僕はちゃんとは追っていなかったというのもある)。ただ、「なぜ、こういう拡張をしたのか」という言語デザインの決定についてのセッションとしてはおそらく価値があったし(と僕の判定だから「おそらく」と条件付き)、それはそれとして上手なプレゼンは聞いていて面白いので、横浜に行ったモトは十分に取れた感じです。