2014-12-09 6 views
0

이와 관련된 많은 복잡한 질문을 살펴본 후 정적 필드 초기화가있는 다음 코드에 대한 설명을 원합니다. 내가 알고 싶은 또 하나의 점은 정적 필드 초기화의 요구 사항입니다. 어떤 시나리오에서 유용할까요 ??정적 필드 초기화 설명 및 해당 요구 사항

using System; 

class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine("{0} {1}", B.Y, A.X); 
    } 

    public static int F(string s) 
    { 
     Console.WriteLine(s); 
     return 1; 
    } 
} 

class A 
{ 
    static A() 
    { } 

    public static int X = Test.F("Init A"); 
} 

class B 
{ 
    static B() 
    { } 

    public static int Y = Test.F("Init B"); 
} 

출력 :

초기화 B

초기화

1

정적 생성자 다음 출력 본 달라질 수 없다. 나는 그 뒤에있는 이론적 근거를 이해할 수 없다. 정적 필드 초기화가이 부분에 가져온 차이점은 무엇인가? 누군가 제발 도와 줄 수 있어요. 나는 C#으로 newb입니다.

+3

게시 할 때 코드를 포맷하는 데 시간이 걸릴 수 있습니다. 들여 쓰기가 없을 때 읽는 것은 정말 어렵습니다. –

+0

나는 형식을 지정한 후에 게시했습니다. 어디서 들여 쓰기를 원하십니까? 제발 언급 해주십시오. 미래의 게시물에서 나를 도울 것입니다. – Neha

+0

게시물의 모양을 확인하십시오. 모든 들여 쓰기가 적절합니다. 이제 원래 * 게시물을보십시오 ("편집"을 클릭하고 버전 1을보십시오). 메소드는 들여 쓰기가되지 않았습니다. –

답변

4

유형에 정적 생성자가있는 경우 유형의 멤버를 처음 사용하기 직전에 모든 유형 초기화를 실행하도록 런타임이 제한됩니다.

정적 생성자가없는 경우 런타임에 훨씬 더 자유 롭습니다. 정적 필드를 처음 사용하기 전에 또는 인스턴스가 생성되기 전에 어느 시점에서 유형 초기화 프로그램을 실행해야하지만 그게 전부입니다. 타입 이니셜 라이저가 실행되지 않고 실행되는 정적 필드를 만지지 않는 정적 메소드도 관찰 할 수 있습니다.

AB 모두 정적 생성자가 있으며 멤버에 대한 액세스 순서는 B부터 시작하여 결과가 A입니다. 정적 생성자가 없으면 마지막 줄로 "1 1"을 얻을 수 있으며 "Init A"와 "Init B"를 얻을 수 있지만 순서가 보장되지는 않습니다.

이것은 언어와 런타임이 지정된 방식이며, 일반적으로 형식 이니셜 라이저는 은 다른 부작용없이 설정해야하므로 일반적으로 영향을 미치지 않습니다. 타입 이니셜 라이저는 가능한 한 적게해야합니다. 이상적으로는 어떤 이유로 실패 할 경우 은 결코이 될 수 없습니다. 형식 초기화 프로그램이 다시 시도되지 않습니다.

자세한 내용은 내 beforefieldinit article.NET 4.0 type initializer changes 블로그 게시물을 참조하십시오.