2011-11-27 3 views
11

다음 코드 :왜 static 필드 초기화가 정적 생성자보다 먼저 발생합니까?

static void Main(string[] args) 
{ 
    Console.WriteLine("0"); 
    string h = Foo.X; 
    Console.WriteLine("2"); 
} 

public static class Foo 
{ 
    public static string X = ((Func<string, string>)delegate(string g) 
    { 
     Console.WriteLine(g); 
     return (g); 
    })("_aaa"); 

    static Foo() 
    { 
     Console.WriteLine("ctor"); 
    } 
} 

가 인쇄됩니다 : 나는 (정적 생성자 등이 부착 된 /)를 beforefieldinit 행동에 대해 알고

0 
_aaa 
ctor 
2 

. (출력 단위) ctor_aaa왜 내가 이해가 안

것은 무엇입니까?

아무런 의미가 없습니다. 생성자에서 변수를 초기화하려면 어떻게해야합니까?

질문

X의 초기화가 ctor 앞에있는 이유는 무엇?

+0

비 정적 필드와 비 정적 생성자에 대해서도 비슷합니다.'class Foo {public string X = "A"; public Foo() {X = "B"; }}'이렇게하면 ('new Foo()) .X'를하면''B ''의 할당이 마지막으로 발생했기 때문에''A''가 아니라''B "'를 얻습니다. 값). –

+0

@JeppeStigNielsen 설명해 주셔서 감사합니다 –

답변

17

필드 이니셜 라이저 이후에 ctor이 나오는 이유는 그것이 지정된 방식이기 때문입니다. 는 C# 명세서에서 (강조는 내)

10.5.5.1 정적 필드 초기화 클래스의 스태틱 필드 변수 초기화 그들이에 나타나는 는 텍스트 위해 실행되는 과제의 시퀀스에 대응 클래스 선언. 정적 생성자 (§10.12)가 클래스에 있으면 해당 정적 생성자를 실행하는 바로 전에 정적 필드 초기화 프로그램이 실행됩니다.은 그렇지 않으면, 정적 필드 초기화는

당신이 당신의 초기화 순서의 총 통제를 원한다면

, 모든 이동 이전 그 클래스의 정적 필드의 첫 번째 사용 구현에 의존하는 시간에 실행됩니다 생성자 내부.

+0

큰 감사 ... –

관련 문제