C#은 정적 데이터 구성원 간의 종속성을 자동으로 해결합니까?

StackOverflow https://stackoverflow.com/questions/1727301

  •  19-09-2019
  •  | 
  •  

문제

하나의 정적 데이터 멤버가 다른 정적 데이터 구성원에 의존하는 경우 C#/. NET 보증이 의존 한 정적 멤버가 종속 멤버보다 먼저 초기화됩니까?

예를 들어, 우리는 다음과 같은 한 수업이 있습니다.

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

언제 foo.b 액세스, 항상 "abcdef"또는 "def"가 될 수 있습니까?

이것이 보장되지 않는 경우, 차원이 먼저 초기화되도록하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

앞에서 말했듯이, 정적 필드 초기화는 결정적이며 텍스트 선언 순서에 따라 간다.

예를 들어 다음과 같습니다.

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

foo.b는 항상 "def"를 초래합니다.

이 문제에 대해 정적 필드간에 종속성이 있으면 정적 이니셜 라이저를 사용하는 것이 좋습니다.

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

그렇게하면 초기화 순서에 대한 우려를 명시 적으로 표현합니다. 또는 해당 문제에 대한 종속성 (실수로 초기화 명령문을 교체하면 컴파일러가 도움이되지 않더라도 위의 위의 예상 값은 A와 B에 저장됩니다 (각각 "ABC"및 "ABCDEF").

그러나 여러 클래스에서 정의 된 정적 필드의 초기화에 대해서는 비틀기 (및 구현 별)가 될 수 있습니다. 그 영역 10.4.5.1 정적 필드 초기화 언어 사양 중에서 더 많은 이야기를합니다.

다른 팁

초기화는 오늘날과 마찬가지로 소스에서 상승하기 때문에 Allways "Abcdef"를 보여줄 것입니다.

모든 정적 멤버는 클라스 스타일을 고정시킬 때 초기화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top