2016-08-08 1 views
2

나는이 2 개 개의 클래스가 있다고 가정 :다른 클래스가 사용하기 전에 정적 컬렉션이 초기화/채워지도록 보장되어 있습니까?

public class A<T> where T : IEntityWithID, new() 
{ 
    private static EntityInfo entityInfo = B.GetEntityInfo(typeof(T)); 

    private static IEnumerable TestCases 
    { 
     // Do work with entityInfo... 
    } 
} 

private static class B 
{ 
    private static IList<EntityInfo> entityInfoList = B.GetEntityList(); 

    public static EntityInfo GetEntityInfo(Type type) 
    { 
     return entityInfoList.Single(e => e.Types.Contains(type)); 
    } 

    private static IList<EntityInfo> GetEntityList() 
    { 
     // Builds a list of EntityInfo's... 
    } 
} 

는 클래스 B의 entityInfoList인가를 초기화 B.GetEntityInfo 전에 채워 보장() 클래스 A에서라고?

+0

'B.GetEntityInfo()'는 어디에 있습니까? 너는 그것을 보여주지 않는다. – itsme86

+0

B.GetEntityInfo() 정의 추가 ... – Andrew

+0

'GetEntityList '는 어떻게 구축 되었습니까? –

답변

5

예, 보증됩니다. MSDN의 스 니펫은 다음과 같습니다.

프로그램이 클래스가로드 될 때 정확히 지정할 수 없습니다. 그러나 은 프로그램에서 처음으로 클래스가 참조되기 전에로드되고 필드가 초기화되고 정적 생성자가 호출되도록 보장됩니다.

EDIT : 지적한대로 2 개의 정적 클래스가 서로 초기화되어 문제를 일으킬 수있는 상황이 발생할 수 있지만 문제가되지 않는 한 괜찮습니다.

+0

고마워,이 정확히 내가 무엇을 찾고 있었는지. – Andrew

+0

이것은 거짓입니다. 실제로 이니셜 라이저가 끝나기 전에 그러한 필드의 값을 얻을 수 있습니다. – Servy

+0

그는 실제로 * 완성 된 *에 대해 묻지 않았습니다. 초기화되고 (채워진) 것입니다. 아래의 답변은 초기화되고 채워지는 것을 보여 주지만, 그 일이 발생하면 덮어 쓸 기회가 있습니다. –

4

아니요, 순환 종속성이있는 경우 해당 클래스의 정적 초기화가 완료되기 전에 클래스에서 코드를 실행할 수 있습니다.

여기 5으로 초기화 정적 필드의 간단한 예제, 아직 외부 클래스는 null되는 해당 필드 관찰 :

public class A 
{ 
    public static void Foo() 
    { 
     Console.WriteLine(B.bar == null); 
    } 
} 

public class B 
{ 
    public static readonly object bar = Foo(); 

    public static object Foo() 
    { 
     A.Foo(); 
     return 5; 
    } 
} 

private static void Main(string[] args) 
{ 
    var bar = B.bar; 
} 

true를 인쇄합니다.

+0

이것은 명심해야 할 사항이지만 (downvoted하면 안됨) 직접 질문에 대답하지는 않습니다. 아마도 그것이 추가 정보라고 설명하는 편집일까요? –

+2

@KeithPayne 질문에 어떻게 대답하지 않습니까? 이 질문은 주어진 메소드가 호출되기 전에 값이 채워지는지 여부를 묻습니다. 메소드를 호출 할 때 메소드가 채워지지 않도록 할 수있는 방법을 보여 주었고, 따라서 보장을 할 수 없다는 것을 증명했습니다. – Servy

+1

무슨 뜻인지 알 겠어. 나는 당신의 대답을 완전히 이해하지 못했습니다. 하지만 여전히 100 % 온 - 포인트가 아닌 것 같습니다. 문제의 코드는 순환 종속성을 포함하지 않습니다. 그러나 추상적으로, 그것은 유효한 관심사입니다. –

관련 문제