最初に、初期化で明示的または暗黙的に「this」への参照が必要な場合は、ctor で初期化する必要があります。
class C
{
int x = MakeX();
int MakeX() { whatever }
}
呼び出しは暗黙的に行われ、まだ ctor を実行していないため、これはthis.MakeX()
違法ですthis
。 これは合法です:
class C
{
int x;
int MakeX() { whatever }
public C() { this.x = this.MakeX(); }
}
this
明らかに、 ctor 本体自体での使用を制限できないためです。
また、フィールド初期化子は、最も派生したものから最も派生していないものの順に実行され、最初に実行されることに注意してください。基本クラスのコンストラクターは、派生の少ないものから派生の多いものの順に実行され、 2 番目に実行されます。それが問題になることはめったにありませんが、とにかく知っておくと役に立ちます。
一般的に、アドバイスは「一貫性を保つ」ことです。一部のフィールドは初期化子で初期化し、一部は ctor 本体のステートメントで初期化しないでください。1 つを選択し、一貫して実行します。