C#3.0 では、オブジェクトを生成する際の初期化も簡潔に書けることができます。
例えば、以下のようなコードがあったとします。
class MyClass {
public string Name;
public int Age;
}
上記のクラスからオブジェクトを生成する時、以下のように書く必要がありました。
MyClass x = new MyClass();
x.Name = "R・田中一郎";
x.Age = 18;
また、初期化用のコンストラクタを設けることで、初期化を簡潔に書くこともできます。
class MyClass {
public string Name;
public int Age;
public MyClass() {}
public MyClass(string name, int age) {
this.Name = name;
this.Age = age;
}
}
MyClass x = new MyClass("R・田中一郎", 18);
しかし、当然のことながら初期化用のコンストラクタを持っていなければ、この書き方はできません。
C#3.0 では、上記の
良いところ取り
の書き方ができるようです。
class MyClass {
public string Name;
public int Age;
}
MyClass x = new MyClass{ Name = "R・田中一郎", Age = 18 };
上記 1 行は、最初のサンプルと同じ意味を持ちます。
ここまでは、わかりやすくて純粋に素晴らしいと思ったのですが、ちょっとわかりにくいように感じたのがコレクションの初期化です。
List<int> age = new List<int> { 18, 18, 18 };
コレクションの初期化も配列のように書けるようになっています。そう考えればわかりやすいのですが、コレクションのアイテムを追加するのは、Add() メソッドを使って以下のように書く訳です。
List<int> age = new List<int>();
age.Add(18);
age.Add(18);
age.Add(18);
上記の書き方と同様に考えると、以下のように書く方が自然に思えるのですが・・・
List<int> age = new List<int>{ Add(18), Add(18), Add(18) }; // これは間違った書き方ですよ!!(念のため)
コレクションのイニシャライザは「Add だよー」という指定がどこかでできたりするのでしょうかね?