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

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



답변

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

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

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


답변

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

요약:

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

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


답변

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

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


답변

부모 클래스에서 정적 메서드를 호출하는 경우 정적 생성자는 호출되지 않고 명시 적으로 지정됩니다. 다음은 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
    }
}


답변

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

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

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

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


답변