Visual Studio 2008 C#で開発効率アップ!

第1回 コード比較で理解するC#3.0の新機能(1)

この記事を読むのに必要な時間:およそ 3 分

匿名型(Anonymous types)

C#3.0

class Sample {
    private void MyMethod() {
        var suzuki
            = new { Code = 5 , Name = "鈴木”, Age = 31 };
    }
}

C#2.0

class Sample {
    private void MyMethod() {
        Member suzuki = new Member();
        suzuki.Code = 5;
        suzuki.Name = "鈴木”;
        suzuki.Age = 31;
    }
}

class Member {
    private int _Code;
    public int Code {
        get { return this._Code; }
        set { this._Code = value; }
    }
    private string _Name;
    public string Name {
        get { return this._Name; }
        set { this._Name = value; }
    }
    private int _Age;
    public int Age {
        get { return this._Age; }
        set { this._Age = value; }
    }
}

C#3.0のサンプルコードは,オブジェクト初期化子でご紹介したコードから単純に型名を除いたものです。

suzukiというオブジェクトの型は,new {}から暗に生成されます。

本来は,C#2.0のサンプルコードのように実際に値を格納するためのクラスを作成する必要があるのですが,匿名型とオブジェクト初期化子によって簡潔に記述できます。

コレクション初期化子(Collection initializers)

C#3.0

var c = new List<Member> { suzuki, sato, yamada };

C#2.0

List<Member> c = new List<Member>();
c.Add(suzuki);
c.Add(sato);
c.Add(yamada);

これについても,サンプルコードを見ていただいた通りです。 配列の初期化では,既に同じような記述が使えていました。

配列は,単純に値を格納しますが,コレクションはAddメソッドによって要素を追加しますので,表記は似ていますが機能としては異なるものです。

配列初期化子(Array Initializer)

C#3.0

var a = new [] { 1, 2, 3 };

C#2.0

int[] a = { 1, 2, 3 };

C#3.0では型推論が行われています。 そのほかは,コレクション初期化子と同様です。

拡張メソッド(Extension methods)

C#3.0

public void Hoge() {
    var byteLength = "あいうeo".GetByteLength();
}

public static int GetByteLength(this string value) { /* 略 */ }

C#2.0

public void Hoge() {
    var byteLength = GetByteLength("あいうeo”);
}

public static int GetByteLength(string value) { /* 略 */ }

拡張メソッドによって,既存のクラスに対して外部からメソッドを追加できます。

上記は,共に「あいうeo」という文字列のバイト数を取得する処理を,C#3.0では拡張メソッドによって,C#2.0では静的メソッドによって実現した例です。 拡張メソッドによって,string型に直接GetByteLengthメソッドを外部から追加しています。

拡張メソッドを書く場合は,⁠string value」引数の直前に「this」キーワードを付加します。 上記の例では,string型のvalueには「あいうeo」が格納されていることになります。

拡張メソッドは同一の名前空間に対して有効です。 また,using句で指定することで,別の名前空間で記述した拡張メソッドも有効になります。

例えば「System.Linq」名前空間をusingすることで,たくさんの拡張メソッドが利用できるようになります。 次回以降ご説明するLINQでは,この拡張メソッドを使うことによって,非常に便利な機能が実現できるようになっています。

次回の予定

今回は,言語構文を覚えるだけで比較的簡単に覚えられる機能について中心にご説明しました。

次回は,もう少し複雑なラムダ式についてをご説明していきたいと思います。

著者プロフィール

伊藤達也(いとうたつや)

Microsoft MVP for Visual C#(April 2007 - March 2009)

自他共に認めるC#信者です。

(株)井沢電器設備(ビットラン)にて,主に業務管理システムの設計・開発を行っています。開発に関するご依頼ご相談など常時受け付けております。お気軽にご連絡ください。

Mailito@bitlan.net