LINQ……その前に
.NETが3.5になり、合わせてVisual Basicは9.0に、C#は3.0にバージョンアップしました。これによりそれぞれの言語には、言語構文としてのさまざまな新機能が追加されています。いずれも通常のプログラミングで非常に面白く、便利に利用可能なものですので、ここで紹介しておきたいと思います。
型推論
型推論とは、実行されるコードによって変数に格納されている型をコンパイラが推論する機能です。Visual Basicでは従来から遅延バインディングという機能によって実行時に型を決定して動作する仕組みがありましたがこれとは少し意味合いが異なるものになります。以下のコードを見てください。
Dim s = "Hello!"
var s = "Hello!";
このように、VB.NETはAs句を利用しないコードを書きます。C#は型推論される型を示すvarというキーワードを利用します。この例では、「Hello!」という文字列を設定しているため、sという変数はString型として認識されます。VS2008では型推論を利用している状態のインテリセンスも問題なく利用できます(詳細はここが違う! Visual Studio 2008を参照してください)。
なお、型推論を利用すると人間が見た場合に、型が分かりにくくなるという欠点も備えることになります。むやみに型推論を利用しないようにしたり、変数名に分かりやすい名前をつけたりするなど利用上のルールが必要になります。
オブジェクト初期化子
オブジェクト初期化子とは、インスタンス生成時に同時にプロパティなどの値を設定する機能です。単純には、
オブジェクト初期化子=デフォルトコンストラクタ呼び出し+プロパティ設定
となります。オブジェクト初期化子を利用した以下のコードを見てください。
Dim cust As Customer = New Customer() With { .Name = "libaty" }
Customer cust = new Customer() { Name = "libaty" };
上記のコードは次のように分解できます(C#は割愛します)。
Dim cust As Customer = New Customer() cust.Name = "libaty"
引数付きコンストラクタを用意すればいいのではないか? と考えられる方もいるかもしれませんが、オブジェクト初期化子を利用した場合は、好きなプロパティ(フィールドも可)を自由に初期化できます。また、VS2008では、オブジェクト初期化子を利用する際にもインテリセンスのサポートを受けることができます。
匿名型
匿名型とは、予め決められた型を作成せずにインスタンスを作成する機能です。予め決められた型を作成しないため、メソッドを格納することはできず、プロパティのみを持つことができます。匿名型を利用した以下のコードを見てください。
Dim product = New With { .Name = "チョコレート", .Price = 100 }
var product = new { Name = "チョコレート", Price = 100 };
上記のコードはインスタンスを生成するNewキーワードの直後に型名がありません。このように型名を指定せず、オブジェクト初期化子を利用して生成されるクラスを匿名型と言います。匿名型はObjectクラスを直接継承したクラスですが、型名はコンパイラが自動で決定するため、変数は型推論を利用した状態で保持する必要があります。
拡張メソッド
拡張メソッドは既存クラスの派生クラスを作成することなく、既存クラスにメソッドを追加できる(ような)機能です。「ような」としているのは、事実上そのような利用ができるが、厳密には少し異なるためです。まずは拡張メソッドを定義した以下のコードを見てください。
Module StringExtensions <Extension()> _ Public Sub Print(ByVal source As String) Console.WriteLine(source) End Sub End Module
public static class StringExtensions { public static void Print(this String source) { Console.WriteLine(source) } }
Visual BasicでもC#でも静的メソッドとして構成する必要がありますが、Visual Basicの場合にはさらにExtension属性を設定する必要があります。この例では、引数としてString型を設定しているため、String型のインスタンスでPrintという新しいメソッドが利用可能となります。このように特別な静的メソッドを構成し、既存のクラスに新しいメソッドを追加するのが拡張メソッドです。VS2008ではインテリセンスで拡張メソッドを表示できるので簡単に利用することができます。
ラムダ式
ラムダ式とは、ある処理を行い、単一の結果を返却する名前を持たないメソッドを定義する機能です。このメソッドはデリゲート型として利用することができ、定義したラムダ式を変数に代入しておくことも可能です。ラムダ式を利用した場合、例えばVB.NETではAs句を利用して戻り値の型を明示的に指定することはできませんが、処理内容から戻り値の型は自動的に型推論されます。ラムダ式の記述例は以下のコードを見てください。
Dim func = Function(str As String) str = "libaty"
// 下の1行はクラス定義として定義しておく delegate bool MyFunc(string str); MyFunc func = str => str == "libaty"
この例では、String型の引数strを受け取り、引数と文字列「libaty」を比較するという処理を行うラムダ式を定義し、func変数に代入しています。これを利用する場合には、
Console.WriteLine(func("fujiko"))
とすることで利用できます(この例の場合、False
と出力されます)。このようにあるデリゲート型に対して、名前なしメソッドでインスタンスを作り、それを利用するという過程の名前なしメソッドの定義を行える機能がラムダ式になります。