2012-03-28 6 views
2

私は疑いがあります。パブリックメンバーvs C#でクラスのコンストラクタ?

1. namespace JIMS.ViewModel.Stock 
2. { 
3.  internal class StockGroupViewModel : JIMS.ViewModel.BaseViewModel 
4.  { 
5.   JIMSEntities dbContext = new JIMSEntities(); 
6. 
7.   public StockGroupViewModel() 
8.   {      
9.   dbContext = new JIMSEntities(); 
10.  } 
11. } 
12. } 

私はこのクラスを持っています。そして私は最初に呼ばれたものを知りたい。私はこのクラス

StockGroupViewModel s = new StockGroupViewModel(); 

Line 5 or Line 9.

+1

で次のようになり、私はそれが重要わからないんだけど、私はあなたがここにコンストラクタを削除する必要があります。5.で行くと思います。 – Jodrell

+2

ブレークポイントを設定できました。 BrokenGlassは、[OK]を –

+0

正しいです私はこのエラーを取得したことは、ここで初期化順序の表示 –

答えて

12

5行目のインスタンスを作成するときに - それは、コンストラクタ内の任意のコードの前に実行されたフィールド初期化子です。

スペックより:

10.5.5.2インスタンスフィールドの初期化

クラスのインスタンスフィールド変数初期化子が をのいずれかに入るとすぐに実行される割り当ての配列に対応そのクラスのインスタンス コンストラクタ(§10.11.1)。変数初期化子は、彼らがクラス 宣言に表示されるテキストの順序で実行 あります。クラスインスタンスの作成および初期化プロセスは、§10.11でさらに説明されている です。前コンストラクタの本体に呼ば

2

フィールド初期化子。コンストラクタが呼び出される前に、だから、ライン5はライン9

1

5行目の前に呼び出され、フィールドが初期化されます。

1

コンパイラはフィールドの初期化子をコンストラクタのコードに埋め込みます。最初に呼び出されるのはで、の場合、コンストラクタの呼び出しによってフィールドが再び初期化されます。 ILのコードを見ると、これは非常に明白です。

など。この

class Foo 
{ 
    StringBuilder sb = new StringBuilder(1); 

    public Foo() 
    { 
     sb = new StringBuilder(2); 
    } 
} 

ようなコードは、この場合、ILレベル

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldc.i4.1 <-- ARGUMENT = 1 
    L_0002: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32) 
    L_0007: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o 
    L_000c: ldarg.0 
    L_000d: call instance void [mscorlib]System.Object::.ctor() 
    L_0012: nop 
    L_0013: nop 
    L_0014: ldarg.0 
    L_0015: ldc.i4.2 <-- ARGUMENT = 2 
    L_0016: newobj instance void [mscorlib]System.Text.StringBuilder::.ctor(int32) 
    L_001b: stfld class [mscorlib]System.Text.StringBuilder playground.Foo::o 
    L_0020: nop 
    L_0021: ret 
} 
関連する問題