2012-03-28 2 views
2

나는 의심의 여지가있다.public 멤버 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가 정확합니다 –

+0

좋아, 그 이유는 내가 'StockGroupViewModel의 인스턴스를 만들 수 없습니다'보기에서 –

답변

12

5 호선의 인스턴스를 만들 때 는 - 그것은 생성자 내에서 코드 전에 실행되는 필드 이니셜 라이저입니다. 클래스

10.5.5.2 인스턴스 필드 초기화

인스턴스 필드 변수 초기화가 중 어느 하나에 바로 입력시 실행 할당 시퀀스에 대응 : 사양에서

그 클래스의 인스턴스 생성자 (§10.11.1). 변수 이니셜 라이저는 클래스에 나타나는 텍스트 순서로 실행되는 입니다. 클래스 인스턴스 생성 및 초기화 프로세스는 §10.11에서 더 자세히 설명 된 입니다.

2

생성자 본문보다 먼저 호출되는 필드 초기화 프로그램입니다. 그래서 라인 5는 라인 9 전에 호출됩니다.

1

라인 5는 생성자가 호출되기 전에 필드가 초기화됩니다.

1

컴파일러는 생성자의 코드에 필드 이니셜 라이저를 포함하므로 first가 호출되고 이면 필드가 생성자의 호출에 의해 다시 초기화됩니다. 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 
} 
관련 문제