クラスのメンバー変数を初期化する際には、コンストラクタではなく、初期化子を使うべきである。
public class MyClass
{
// 初期化子(推奨)
private List<string> _labels = new List<string>();
// コンストラクタ(非推奨)
public MyClass()
{
_labels = new List<string>();
}
}
コンストラクタはいくつも定義できるので、いずれかで初期化漏れが発生するおそれがあるが、初期化子は1箇所だけなので、確実に初期化が行われる。
初期化子は便利だが、使用すべきではないケースが3つある。
1つめは、オブジェクトを0またはnullに初期化する場合である。メンバーは、デフォルトで0ないしnullに初期化されるので、これらの値への初期化を行うのは無駄である。
2つめは、複数の初期化処理を同じオブジェクトに定義する場合である。初期化子は、全てのコンストラクタで同じ値を設定される変数にのみ使うべきである。
以下のように、コンストラクタによって初期化方法が変わる場合には、初期化子を使わず、コンストラクタで初期化すべきである。
public class MyClass
{
private List<string> _labels;
public MyClass()
{
_labels = new List<string>();
}
public MyClass(int size)
{
_labels = new List<string>(size);
}
}
3つめは、初期化時に例外処理を行う必要がある場合である。初期化子はtryブロックで囲むことはできないため、例外処理を行う場合はコンストラクタを使う必要がある。