정적 생성자를 포함하는 클래스가있는 경우 해당 클래스를 포함하는 어셈블리가 처음로드되거나 해당 클래스에 대한 첫 번째 참조가 적중 할 때 해당 생성자가 호출됩니까?
답변:
클래스에 처음으로 액세스 할 때.
정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행해야하는 특정 작업을 수행하는 데 사용됩니다. 첫 번째 인스턴스가 생성되거나 정적 멤버가 참조되기 전에 자동으로 호출됩니다.
A static constructor is used to initialize any static data
아니. static initializer
정적 항목을 초기화하는 데 사용 하는 것이 좋습니다.
간단한 문서화에도 불구하고 예상만큼 간단하지는 않습니다. Jon Skeet의 기사 http://csharpindepth.com/Articles/General/Beforefieldinit.aspx 는이 질문에 대해 자세히 설명합니다.
요약:
정적 생성자는 즉시 실행되도록 보장됩니다. 해당 클래스의 멤버에 대한 첫 번째 참조 (인스턴스 생성 또는 자체 정적 메서드 / 클래스 속성) .
정적 초기화 프로그램 (정적 생성자가없는 경우)은 특정 필드를 처음 참조하기 전에 언제든지 실행되도록 보장됩니다 .
정적 생성자는 클래스에서 어떤 것을 사용하기 전에 호출되지만 정확히 언제 발생하는지는 구현에 달려 있습니다.
첫 번째 정적 멤버에 액세스하기 전과 첫 번째 인스턴스가 생성되기 전에 호출되도록 보장됩니다. 클래스가 사용되지 않으면 정적 생성자가 전혀 호출되지 않을 수도 있습니다.
다른 곳에서 답변을 받았지만 간단한 설명으로 이해하는 데 시간이 걸리는 정적 생성자가있는 것 같습니다. 모든 문서와 설명은 첫 번째 클래스가 인스턴스화되거나 첫 번째 정적 필드가 참조되기 전에 정적 생성자 / 인티 얼라이 저가 실행되도록 "보장"된다고 주장합니다. 자신의 인스턴스 (닭 / 달걀)를 생성하는 클래스에 정적 싱글 톤을 넣으려고 할 때 문제가 발생합니다. 이 경우 정적 생성자는 인스턴스 생성자 다음에 호출됩니다. 제 경우에는 인스턴스 생성자에 일부 정적 데이터에 의존하는 코드가 포함되어 있습니다.
정적 생성자는 비 정적 생성자 다음에 실행할 수 있습니다. 이것은 컴파일러 버그입니까?
(나에게 대답은 싱글 톤을 별도의 클래스에 넣거나 필요하기 전에 인스턴스 생성자에서 정적 데이터를 수동으로 초기화하는 것이 었습니다)