2011-06-23 17 views
0

私のようなクラスがある場合:C#では、最初にプライベートなメンバー変数またはコンストラクタが起動し、その理由は何ですか?

public class A 
{ 
    public A(string name) 
    { 
     Console.WriteLine("Mon"); 
    } 
} 

public class B 
{ 
    private A m_a = new A("Tues"); 

    public B() 
    { 
     m_a = new A("Wed"); 
    } 
} 

を私は出力をテストすることはできませんので、私はWindowsマシン上ではありませんよ。

それは何でしょうか、もっと重要なのはなぜですか?

つまり、private varがコンストラクタの前にインスタンス化される理由、またはその逆です。または、無視されるか、単に上書きされますか?

Javaは同じ動作ですか?

答えて

4

C#とJavaの両方で、コンストラクタの外にあるすべての初期化は、コンストラクタの呼び出しより前に行われます。コンストラクタの代入は、他の代入を上書きします。

C#については、少なくとも10.11節のlanguage specificationの詳細を参照してください。これは、特に継承が関係している場合、順序付けの細かい詳細のいずれかに答える必要があります。 17.4.5変数初期化子C#の仕様に従って、

+0

を? – Blankman

+0

@Blankmanインスタンスが初めて作成されたときと、静的コンストラクタがまだ呼び出されていない場合のみです。 「クローズドクラス型の静的コンストラクタは、特定のアプリケーションドメインで最大で1回のみ実行されます。静的コンストラクタの実行は、アプリケーションドメイン内で発生する次のイベントのうちの最初のものによってトリガされます。 ・クラスタイプが作成されます。 ・クラスタイプの静的メンバーのいずれかが参照されます。 –

+0

どこを読んだのですか?あなたがリンクしている仕様(実際の仕様)へのリンクを見つけることができないか、それともダウンロードする必要がありますか? – Blankman

3

Java(おそらく同じ)ではどのように動作するのかわかりませんが、C#のメンバー変数はコンストラクターが実行される前にインスタンス化されています。理由については、私はそれについて考えたことは一度もありませんでしたが、私は最良の答えはわかりませんが、実際には、メンバー変数がコンストラクタ内ですでにインスタンス化されているためです。

2

(クラス内の)変数初期化子がそのクラスのコンストラクタの前に呼び出されます。プライベートA m_a = new A("Tues")m_a = new A("Wed")の前に呼び出されます。これは、コンストラクタがプライベート変数の値を使用する必要があるためです。私はJavaがこれと同じように動作すると仮定しますが、今はテストできません。

0

:インスタンスフィールドについて

、変数 イニシャライザはクラスの インスタンスが作成されるときに実行される割り当て 文に対応します。

すべてのフィールドもかかわらず、フィールドには、変数初期化子を持っているかどうかの実行デフォルト値の初期化子を持っている:

初期 は1.4.3で説明するデフォルトの値はフィールドを含め、すべての のフィールドに発生します変数の初期化子は です。したがって、 クラスが初期化されると、そのクラスのすべての静的 フィールドは、デフォルト値 に初期化された になり、次に静的フィールド初期化子 がテキスト順に実行されます。クラス のインスタンスが作成されたとき は同様に、 そのインスタンス内のすべてのインスタンスフィールドは、最初にそのデフォルト値を に初期化され、その後、 インスタンスフィールド初期化子は、テキスト順に実行 あります。

基本的に、プライベートメンバーの初期化と構造の初期化の違いはありません。コンパイラはすべてのオブジェクトのインスタンス初期化ルーチンをテキスト順に並べます。私はここに、この決定に入った設計上の考慮事項のいくつかについて議論

3

:あなたがオブジェクトのインスタンスを作成するとき(あなたはコンストラクタの両方のタイプを持っている場合)、静的コンストラクタが呼び出されます

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

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

関連する問題