C #에서 정적 생성자는 언제 호출됩니까?


88

정적 생성자를 포함하는 클래스가있는 경우 해당 클래스를 포함하는 어셈블리가 처음로드되거나 해당 클래스에 대한 첫 번째 참조가 적중 할 때 해당 생성자가 호출됩니까?

답변:


93

클래스에 처음으로 액세스 할 때.

정적 생성자 (C # 프로그래밍 가이드)

정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행해야하는 특정 작업을 수행하는 데 사용됩니다. 첫 번째 인스턴스가 생성되거나 정적 멤버가 참조되기 전에 자동으로 호출됩니다.


6
흥미롭게도 "첫 번째 인스턴스가 만들어 지거나 정적 멤버가 참조되기 전에"라는 내용입니다. 실제로 호출 될 때 약간의 여유가 있습니다.
Tim Barrass

6
@TimBarrass 인해 그 밖의 사양 회전의 다른 요구 사항 "전에"는 실제로 "직전"에 - 존 소총의 기사가 다른 대답에서 참조 참조 - stackoverflow.com/a/1437372/477420
알렉세이 Levenkov

A static constructor is used to initialize any static data아니. static initializer정적 항목을 초기화하는 데 사용 하는 것이 좋습니다.
Yousha Aleayoub

41

간단한 문서화에도 불구하고 예상만큼 간단하지는 않습니다. Jon Skeet의 기사 http://csharpindepth.com/Articles/General/Beforefieldinit.aspx 는이 질문에 대해 자세히 설명합니다.

요약:

정적 생성자는 즉시 실행되도록 보장됩니다. 해당 클래스의 멤버에 대한 첫 번째 참조 (인스턴스 생성 또는 자체 정적 메서드 / 클래스 속성) .

정적 초기화 프로그램 (정적 생성자가없는 경우)은 특정 필드를 처음 참조하기 전에 언제든지 실행되도록 보장됩니다 .


: 언급 된 기사는 존 소총의 사이트에 지금 csharpindepth.com/Articles/General/Beforefieldinit.aspx
Sudhanshu 슈라

다음 질문 stackoverflow.com/questions/32525628/… "즉시"동작이 매우 명백한 경우를 보여줍니다.
Alexei Levenkov 2015 년

1
실제로 콘솔 응용 프로그램의 Main 메서드가 실행되기 직전에 정적 생성자가 호출 된 경우가있었습니다!
HerpDerpington

19

정적 생성자는 클래스에서 어떤 것을 사용하기 전에 호출되지만 정확히 언제 발생하는지는 구현에 달려 있습니다.

첫 번째 정적 멤버에 액세스하기 전과 첫 번째 인스턴스가 생성되기 전에 호출되도록 보장됩니다. 클래스가 사용되지 않으면 정적 생성자가 전혀 호출되지 않을 수도 있습니다.


2
그것이 발생할 때 되지 않는 "어플리케이션 도메인 내에서 발생하는 다음 이벤트 중 제에 의해 트리거되는 정적 생성자의 실행 : 그 구현은 ECMA C # 1 규격을 따르는 경우,"구현에의 "[1]은 인스턴스 클래스가 만들어집니다. [2] 클래스의 모든 정적 멤버가 참조됩니다. " (섹션 17.11, ecma-international.org/publications/standards/Ecma-334.htm )
LukeH

1
@Luke : "정적 생성자 실행의 정확한 타이밍은 구현에 따라 다릅니다." ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html
Guffa

2
@Guffa : 기사 작성자의 해석 일 수 있지만 C # 사양의 Microsoft 또는 ECMA / ISO 버전에서는 해당 문구를 찾을 수 없습니다.
LukeH 09-09-17

1

부모 클래스에서 정적 메서드를 호출하는 경우 정적 생성자는 호출되지 않고 명시 적으로 지정됩니다. 다음은 b.methoda ()가 호출되면 b 생성자가 호출되지 않는 예입니다.

static void Main(string[] args)
{
    b.methoda();
}

class a
{
    public static void methoda()
    {
        //using initialized method data
    }
}

class b : a
{
    static b()
    {
        //some initialization
    }
}    

1

다른 곳에서 답변을 받았지만 간단한 설명으로 이해하는 데 시간이 걸리는 정적 생성자가있는 것 같습니다. 모든 문서와 설명은 첫 번째 클래스가 인스턴스화되거나 첫 번째 정적 필드가 참조되기 전에 정적 생성자 / 인티 얼라이 저가 실행되도록 "보장"된다고 주장합니다. 자신의 인스턴스 (닭 / 달걀)를 생성하는 클래스에 정적 싱글 톤을 넣으려고 할 때 문제가 발생합니다. 이 경우 정적 생성자는 인스턴스 생성자 다음에 호출됩니다. 제 경우에는 인스턴스 생성자에 일부 정적 데이터에 의존하는 코드가 포함되어 있습니다.

인스턴스 생성자 이후에 정적 생성자가 호출됩니까?

정적 생성자는 비 정적 생성자 다음에 실행할 수 있습니다. 이것은 컴파일러 버그입니까?

(나에게 대답은 싱글 톤을 별도의 클래스에 넣거나 필요하기 전에 인스턴스 생성자에서 정적 데이터를 수동으로 초기화하는 것이 었습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.