はじめに
今年の2月にリリースされたばかりのVisual Studio 2008に含まれるC#3.0ですが,皆さんは既にお使いになっているでしょうか? C#3.0ではC#2.0の豊富な機能に加え,より新しい多くの機能が言語仕様のレベルで追加されています。
そこで,本特集では,C#3.0の新機能をC#2.0のコードと比較することで,ご理解いただこうと考えています。 これによって,見慣れたコードと新しいコードを比較することで,実際に動作を確認しなくても読むだけで容易に理解できるでしょう。
C#3.0によって,どれだけ開発効率を高めることができるのかを,皆さんなりに判断してみてください。
C#3.0の概要
C#3.0は,C#2.0を基盤として,さらに関数スタイルのクラスの作成がサポートされています。
特に,今回のバージョンアップで目立つのは,LINQという新しいテクノロジーの実現と,これに関連した様々な言語拡張が行われたことです。 例えば,クエリ式やラムダ式がC#の言語として表現できたり,型推論の利用もC#2.0の頃に比べるとさらに様々な場面で利用されています。
以下はC#3.0で拡張された主な機能です。
- 暗黙的型付(Implicitly typed local variables)
- 自動プロパティ(Automatic Properties)
- オブジェクト初期化子(Object Initializers)
- 匿名型(Anonymous types)
- コレクション初期化子(Collection initializers)
- 拡張メソッド(Extension methods)
- ラムダ式(Rambda expressions)
- LINQ(Language Integrated Query)
実際にC#3.0を使ってコードを書くことで私が一番実感するのは,驚くほどソフトウェアの生産性が向上したことです。
しかし,何よりも,C#3.0の言語仕様の拡張は,開発者にとって大変魅力的な面白さを持っています。 開発者である皆さんなら,この特集を読むことによって,きっと「C#3.0を使って開発をしたい!」と思うことでしょう。
それでは実際のコードを比較しながら見ていきましょう。
暗黙的型付(Implicitly typed local variables)
C#3.0
var i = 5;
var s = "A”;
var f = 2f;
var v = GetValue();
var suzuki = new Member();
var list = new List<string>();
using(var dt = new SampleDataSet.SampleDataTable()) {}
C#2.0
int i = 5;
string s = "A”;
float f = 2f;
double v = GetValue();
Member suzuki = new Member();
List<string> list = new List<string>();
using(SampleDataSet.SampleDataTable dt = new SampleDataSet.SampleDataTable()) {}
varというキーワードがvariant型を想像させるためか,どんな値でも格納できる変数を定義していると誤解する方もいるようですが,両者はまったく違うもので,暗黙的型付けとは,コンパイラが型を推論する機能です。
型推論自身は,C#2.0でも一部使われていましたが,C#3.0では,上記のような変数の宣言を始めとして,様々な場所で利用される程に重要な機能になっています。
上記のC#3.0のコードは,C#2.0のコードのように書いたことと同じ意味を持ちます。 例えば,C#3.0の1行目の「var i = 5;」の記述ですが,5を代入することから,iはint型であることをコンパイラが推論します。 また,4行目の「var v = GetValue();」ですが,これはメソッドの戻り値の型に準じます。
コードエディタ上でインテリセンスやヒントを表示すると,その場でvarと記述したものがintとして定義されていることが確認できます。 varは,ローカル変数の宣言のみに使用が限定されているため,戻り値や引数,フィールド変数に用いることはできません。
自動プロパティ(Automatic Properties)
C#3.0
public object MyValue1 { get; set; }}
public object MyValue2 { get; private set; }}
C#2.0
private object _MyValue1;
public object MyValue {
get { return this._MyValue1; }
set { this._MyValue1 = value; }
}
private object _MyValue2;
public object MyValue {
get { return this._MyValue2; }
private set { this._MyValue2 = value; }
}
これについては,サンプルコードを見ていただいた通りです。
C#3.0では,フィールド変数にアクセスすることはできません。 従って,初期化する時は,MyValue1プロパティに対して直接行います。
オブジェクト初期化子(Object Initializers)
C#3.0
var suzuki
= new Member { Code = 5 , Name = "鈴木”, Age = 31 };
C#2.0
Member suzuki = new Member();
suzuki.Code = 5;
suzuki.Name = "鈴木”;
suzuki.Age = 31;
VBのWithに似ていますが,オブジェクト初期化子は,プロパティや公開されたフィールド変数を初期化するために使用します。

