3.5では、VB.NETやC#といった.NET言語の強化も行われている。これら言語機能の拡張は、実はLINQを実現するために必要なものだった。3.5環境では、VB.NETのバージョンは9.0、C#のバージョンは3.0になる。CLRのバージョンは2.0のままであり、これら.NET言語のバージョンアップについてはクラスライブラリとコンパイラによって吸収され、コンパイルされたコードにおけるバージョン間の互換性については問題はないので安心してよい。ここでは、どのような点が強化されたのか、LINQという視点からVB.NETをメインに見てみることにする。最初に取り上げるのは、「暗黙的に型付けされたローカル変数」だ。Doubleのように記述する。1.0のように記述できるようになった。Javaなどのように格納されているデータによって型が変わる変数のように見えなくもないが、初期化時のデータの型を暗黙的に指定しているだけだ。Object型になるわけではない。String」の記述を省略できるにすぎない。これと同じことはC#でも可能となっている。1.0;というJavaのような形で記述する。初期化時のデータの型を暗黙的に指定しているだけなのはC#でも変わらない。次に紹介する強化ポイントは、「オブジェクトイニシャライザ」だ。11のように記述していたと思う。}と記述できるようになり、オブジェクトインスタンスの定義と同時に初期化することができるようになっている。}という形で記述することも可能だ。これを「匿名型」という(ただし、この場合はいくら同じプロパティを持っているとはいっても、Pointクラスとは別のクラスとなる)。ここまでを見ても、この言語拡張が何のために必要なのかピンと来ないかもしれない。これらはすべてLINQを実現するために必要なのだ。次のようなLINQで記述したクエリがあったとする。}と記述したことに等しいことになる。オブジェクトイニシャライザや匿名型のおかげで、LINQ式を簡潔に記述できるようになっているのだ。上記の式では、orderの型が指定されていないが、これも匿名型だ。$Anonymousクラスのコレクションがorderの型になるのをご理解いただけただろうか。これらの言語機能の拡張以外にも、コードをデータとして扱えるようになる「ラムダ式」や、共有メソッドをインスタンスメソッドのように呼び出せるようになる「拡張メソッド」、今まではクラスでしか使えなかったPartial(パーシャルクラス)がメソッドにも対応した「パーシャルメソッド」などの機能が追加されている。した言語の拡張機能を正しく理解すると、LINQの動作についてもきちんとした理解ができるようになるので、すぐに応用して使うような機能でなくても、理解を深めておくと良いだろう。orderの違いを理解していただけるだろうか。*」の違いくらいにしか考えないとしたら、大きな間違いだ。下のLINQ式が定義するorderはdb.orderと同じ型であるのに対し、上のLINQ式で定義するorder型は$Anonymousのコレクション型であり、まったく違っている。後者はdb.orderが含むすべてのプロパティを持つのに対し、前者は3つのプロパティだけを持つことになるからだ。後者のorderコレクションがdb.orderコレクションから指定した条件(ShipNameがAで始まるもの)で選択したorderクラスインスタンスへの参照をコレクションしているのに対し、前者はdb.orderとは別の$Anonymousクラスのインスタンスを新しく生成し、コレクションに格納していることになる。"2007/08/25"のような記述をしたときに、前者はorderコレクションの最初のデータが書き換わるだけだが、後者はdb.orderの該当するデータも書き換わる、という形で違いが現れることになる。バグの原因にもなりかねない。この例はあらためて、言語仕様はきちんと理解しておく必要があるということを教えてくれる。LINQは使い勝手が良いだけにすぐにでも使ってみたくなるが、上記のような注意点もあることを理解して利用することで、生産性を向上させる助けとしたいものだ。広告に関するお問い合わせメールマガジンSpecialインデックスRSSfacebooktwitter利用規約ITmediaはアイティメディア株式会社の登録商標です。