2014-07-24 2 views
13

저는 C#의 동작을 알고 싶습니다. 이 같은 클래스를 고려C# 정적 필드, 인스턴스 생성자

이제
public class SomeSingleton 
{ 
    public static SomeSingleton Default = new SomeSingleton(); 

    private static int field = 0; 

    private SomeSingleton() 
    { 
     field = 1; 
    } 

    public int GetField() 
    { 
     return field; 
    } 
} 

,의는 GetField() 메소드를 호출하자 : 인스턴스 생성자가 생략 된 것처럼 내가 0을 얻고있다

var field = SomeSingleton.Default.GetField(); 

합니다. 왜?

답변

26

Default 앞에 field 선언의 순서를 바꾸면됩니다.

그래서 라인 :

public static SomeSingleton Default = new SomeSingleton(); 
private static int field = 0; 

가 있어야한다 :

private static int field = 0; 
public static SomeSingleton Default = new SomeSingleton(); 

이유는 필드의 초기화 순서 때문이다. 먼저 Defaultfield 값이 1 인 코드에서 초기화됩니다. 나중에 해당 필드에 초기화시 0이 지정됩니다. 따라서 0의 최신 값은 1이 아닙니다.

참조 : 클래스의 10.4.5.1 Static field initialization

정적 필드 변수 초기화는 클래스 선언에 표시 에 텍스트 순서에서 실행되는 과제의 순서에 해당합니다.

+1

더 나은 점은'field'의 초기화 프로그램을 완전히 제거하는 것입니다. 객체가 처음 생성 될 때 모든 필드는 0 (또는 'null')으로 사전 설정됩니다 (유형이 처음로드 될 때 정적 필드 용). –

3

정적 변수의 순서를 전환하십시오. 코드에서

private static int field = 0; 
public static SomeSingleton Default = new SomeSingleton(); 

는, 생성자는 field를 설정하는, 먼저 실행 한 다음 field는 그 값을 무시합니다.

7

이것은 변수 static의 순서 때문입니다. 당신이 두 문장을 전환하는 경우, 출력은 1된다 : MSDN: Static field initialization에 설명 된대로

private static int field = 0; 

public static SomeSingleton Default = new SomeSingleton(); 

이 동작을 것으로 예상된다.

this .NET Fiddle을 참조하십시오.

+4

+1 .NET Fiddle, 멋진 도구에 대한 링크를 제공해 주셔서 감사합니다. –