2012-04-21 11 views
3

簡単な構文を使用して派生クラスのフィールドに直接値を代入して初期化すると、コンパイラは派生クラスのフィールドを初期化してベースの.ctorを呼び出します。なぜそれがベースの.ctorフィールドを呼び出して、派生したクラスフィールドを初期化しないのですか?ベースクラスのフィールドに依存するフィールドがあるとどうなりますか?なぜ基本クラスのコンストラクタが最初に呼び出されないのですか

私はここにいくつかのコードサンプルを置くのが大好きですが、私は携帯電話からこの質問を投稿しています。

+0

フィールドは基本クラスのフィールドに依存することはできません。フィールドは初期化子で 'this'を参照できないため、フィールドは基本クラスのフィールドに依存できません。 –

+0

@Anthony、はい、それは単にOPの質問の一部だと思います。どうして私たちは拷問され、フィールドイニシャライザで 'this'を使用できないのですか? (言い換えれば、Javaとは違って)私はどちらの場合も、安全なコードのより強い保証を提供すると仮定します。しかし時々それは私を悲しくする。 –

+0

実際に良いキャッチ。 – Tarik

答えて

3

コンストラクタ内で仮想メソッドやインターナイザーが呼び出された場合を処理する必要があるからだと思います。

+0

'virtual'メソッドがここにある可能性があります。オーバーライドされている場合、これらのメソッドは基本クラスのメソッドから呼び出される可能性があるため、派生クラスのフィールドに到達する必要があります。 – Tarik

2

Eric Lippertはブログで2部構成のシリーズを持っています。ちょうどあなたのconvineanceのために、ここで言及

http://blogs.msdn.com/b/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx

。お役に立てれば。

Calling methods on derived types from constructors is dirty pool, but it is not illegal. 

グローバルな状態になっていないオブジェクトをスタッフィングするのは危険ですが、違法ではありません。

関連する問題