3.5がリリースされました。2.0、3.0からの変更点の内容を解説します。2008の新機能や機能強化がなぜ施されているかを理解することが目標です。2008(以下、VS2008)がリリースされました。3.5)がリリースされました。3.5にもさまざまな機能強化や新機能の追加がされています。3.5の機能強化、新機能に注目し解説していきます。2008ってなんだ!?の必要な環境と準備を参考にしてください。3.0に機能追加する形で構成されています。次の図1はそのイメージを表したものです。3.5でも同じように利用できます。3.0で追加されたWPFなどの新しい4つのテクノロジーもそのまま利用できます。AJAXやLINQ、言語の新機能の追加といったバージョンであると考えればよいでしょう。3.5で機能強化された点や新機能について扱っていきます。Query:統合言語クエリ)について紹介します。以下の内容については別記事で解説します。2.0/3.0を拡張するような形で構成されています。3.5上でも問題なく動作します。ランタイムバージョンには以下の図2に示すような関係があります(mscorlib.dllやSystem.dllなどほとんどのBCLも同様です)。3.5ではビルド番号(「メジャーバージョン.マイナーバージョン.リビジョン.ビルド」と表現する場合)に違いがあります。SP1を土台にしています。3.5上でも動作する」は概ね正解ですが、完全ではないというところに注意が必要です。2.0にSP1を適用した場合も同じように注意が必要です。3.5で完全動作する可能性がより高いとも言えます。修正される問題で確認できます。3.5ではベースクラスライブラリ、およびその周辺テクノロジーにさまざまな機能強化や新機能の追加がされています。ここではその中からいくつかを抜粋して紹介します。Windowsフォームの新機能Windowsフォームにもいくつかの新機能が追加されています。2008ってなんだ!?の「Windowsアプリケーション開発」で紹介している内容もWindowsフォームの新機能の1つです。ここではこれとは異なるものを紹介したいと思います。1つ目は「ファイルを開く」「ファイルを保存する」のダイアログに関するものです。従来は、実行するOSに合わせたウィンドウが表示されていました。Vistaは、Vista用の新しいタイプとXPと同様なタイプの2種類が利用できるため、これをプロパティで制御できるようになりました。具体的にはOpenFileDialog(SaveFileDialog)クラスのAutoUpgradeEnabledプロパティを設定します。初期値はtrueで、trueの場合はVista用のもの、falseの場合はXPと同様のタイプのものを利用します。XPで実行した場合この設定は無視されます。次に、UACに関するものです。いってもただのアイコンの追加ですが、SystemIconsクラスにShieldプロパティが追加され、このプロパティからUACの管理者特権が必要ですという意味を示すアイコンを取得できます。SP1にも追加となっています。2.0でも利用できていたような錯覚にとらわれることがありますが、実際にはこれらのプロパティを利用したコードは実行時エラーとなってしまうため、注意が必要です。3.5ではピアツーピアネットワークの構築を容易に行えるようにするためのネットワーキング機能が追加されています。Protocol)を利用したピアツーピアネットワークの構築のために、System.Net.PeerToPeer名前空間が用意され、このネットワーク内で高度なコラボレーションを構築するために、System.Net.PeerToPeer.Collaboration名前空間が用意されています。3.5のみに提供されている機能です。その他の新機能これら以外にクラスライブラリとして拡充されている点を簡単に紹介しておきたいと思います。3.5の新機能も合わせて参照してください。Basicは9.0に、C#は3.0にバージョンアップしました。これによりそれぞれの言語には、言語構文としてのさまざまな新機能が追加されています。いずれも通常のプログラミングで非常に面白く、便利に利用可能なものですので、ここで紹介しておきたいと思います。型推論とは、実行されるコードによって変数に格納されている型をコンパイラが推論する機能です。Basicでは従来から遅延バインディングという機能によって実行時に型を決定して動作する仕組みがありましたがこれとは少し意味合いが異なるものになります。以下のコードを見てください。"Hello!";このように、VB.NETはAs句を利用しないコードを書きます。C#は型推論される型を示すvarというキーワードを利用します。この例では、「Hello!」という文字列を設定しているため、sという変数はString型として認識されます。2008を参照してください)。型推論を利用すると人間が見た場合に、型が分かりにくくなるという欠点も備えることになります。むやみに型推論を利用しないようにしたり、変数名に分かりやすい名前をつけたりするなど利用上のルールが必要になります。オブジェクト初期化子オブジェクト初期化子とは、インスタンス生成時に同時にプロパティなどの値を設定する機能です。単純には、オブジェクト初期化子=デフォルトコンストラクタ呼び出し+プロパティ設定となります。オブジェクト初期化子を利用した以下のコードを見てください。};上記のコードは次のように分解できます(C#は割愛します)。考えられる方もいるかもしれませんが、オブジェクト初期化子を利用した場合は、好きなプロパティ(フィールドも可)を自由に初期化できます。VS2008では、オブジェクト初期化子を利用する際にもインテリセンスのサポートを受けることができます。匿名型とは、予め決められた型を作成せずにインスタンスを作成する機能です。決められた型を作成しないため、メソッドを格納することはできず、プロパティのみを持つことができます。匿名型を利用した以下のコードを見てください。};上記のコードはインスタンスを生成するNewキーワードの直後に型名がありません。このように型名を指定せず、オブジェクト初期化子を利用して生成されるクラスを匿名型と言います。匿名型はObjectクラスを直接継承したクラスですが、型名はコンパイラが自動で決定するため、変数は型推論を利用した状態で保持する必要があります。拡張メソッド拡張メソッドは既存クラスの派生クラスを作成することなく、既存クラスにメソッドを追加できる(ような)機能です。「ような」としているのは、事実上そのような利用ができるが、厳密には少し異なるためです。拡張メソッドを定義した以下のコードを見てください。Basicの場合にはさらにExtension属性を設定する必要があります。この例では、引数としてString型を設定しているため、String型のインスタンスでPrintという新しいメソッドが利用可能となります。このように特別な静的メソッドを構成し、既存のクラスに新しいメソッドを追加するのが拡張メソッドです。VS2008ではインテリセンスで拡張メソッドを表示できるので簡単に利用することができます。ラムダ式ラムダ式とは、ある処理を行い、単一の結果を返却する名前を持たないメソッドを定義する機能です。このメソッドはデリゲート型として利用することができ、定義したラムダ式を変数に代入しておくことも可能です。ラムダ式を利用した場合、例えばVB.NETではAs句を利用して戻り値の型を明示的に指定することはできませんが、処理内容から戻り値の型は自動的に型推論されます。ラムダ式の記述例は以下のコードを見てください。"libaty"この例では、String型の引数strを受け取り、引数と文字列「libaty」を比較するという処理を行うラムダ式を定義し、func変数に代入しています。これを利用する場合には、ラムダ式で定義したメソッドの利用Console.WriteLine(func("fujiko"))とすることで利用できます(この例の場合、Falseと出力されます)。このようにあるデリゲート型に対して、名前なしメソッドでインスタンスを作り、それを利用するという過程の名前なしメソッドの定義を行える機能がラムダ式になります。BasicとC#の新しい言語機能について説明してきました。Query:統合言語クエリ)と言われる機能です。通常、プログラミングをしている際には、オブジェクトや配列、データベース、DataSet、XMLなどさまざまな情報にアクセスする必要があります。従来は、アクセス対象に合わせてプログラミングをしていましたが、LINQを利用することで同じようなプログラミング方法で、異なる情報にアクセスできるようになります。LINQを利用する場合には大雑把に以下の3つの手順を踏みます。Serverデータベース、Xmlドキュメント、DataSetなどが利用可能です。これらのアクセス対象には、抽出処理をデータソースに対する処理に変換するLINQプロバイダというものが予め用意されているということでもあります。独自にLINQプロバイダを作成することで、どのようなデータソースに対してもLINQ技術を利用できるということになります。次に、データソースに対する抽出処理です。抽出処理は一般的にクエリ式というものを使って記述されます。仮にcustomersという名前のデータソースが用意されている場合、抽出処理は次のように記述できます。};SQL文をご存じの場合には、順番こそ異なるものの見慣れた構文ではないかと思います。これがLINQで利用されるクエリ式と言われるものです。これはクエリ式を利用してこのようにも記述できるというだけで、実態としては次のようなコードを記述しているのと同義です。});ここでの、WhereやOrderByなどのメソッドはコレクション系クラスなどに対する拡張メソッドです(正確にはIEnumerable(T)インターフェースに対する拡張メソッド)。メソッド、ラムダ式のすべてを総動員している集大成の技術であることがご理解いただけるかと思います。このようなさまざまな機能を利用して書いていたのでは大変なのでこれを簡略化するためにクエリ式という新しい機能を利用して、記述を簡単にしているということになります。Each構文などを利用したり、WindowsフォームのDataGridViewやASP.NETのGridViewなどにそのまま利用したりといったことができます。ASP.NETには新しいDataSourceコントロールとしてLinqDataSourceコントロールというものも用意されているので、データバインド機能の中に簡単に組み込むことができます。3.5の新機能をいろいろな点から紹介しました。Frameworkが位置するところをご理解いただけたでしょうか。クラスライブラリとして、言語そのものとして、さまざまな新機能が追加されていることがわかるかと思います。今回は細かい詳細の動作は説明できませんでしたが、LINQという大きな技術についてこれを支えている言語機能という点から紐解いて説明しました。とっつきにくいと思われる大型テクノロジーを理解する糸口になれば幸いです。3.5世代のASP.NETとWebテクノロジについて解説する予定です。