정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행해야 하는 특정 작업을 수행하는 데 사용됩니다. 첫 번째 인스턴스가 생성되거나 정적 멤버가 참조되기 전에 자동으로 호출됩니다.
정적 생성자는 생성자가 LoadLibrary 메서드를 호출할 수 있는 경우 비관리 코드에 대한 래퍼 클래스를 만들 때 유용합니다. 정적 생성자는 또한 제약 조건을 통해 컴파일 타임에 확인할 수 없는 유형 매개변수에 대한 런타임 검사를 시행하는 편리한 장소입니다.
정적 생성자는 다음과 같은 속성을 가집니다 -
-
정적 생성자는 액세스 수정자를 사용하지 않거나 매개변수를 갖지 않습니다.
-
클래스 또는 구조체는 하나의 정적 생성자만 가질 수 있습니다.
-
정적 생성자는 상속되거나 오버로드될 수 없습니다.
-
정적 생성자는 직접 호출할 수 없으며 CLR(공용 언어 런타임)에서만 호출할 수 있습니다. 자동으로 호출됩니다.
-
사용자는 프로그램에서 정적 생성자가 실행되는 시기를 제어할 수 없습니다.
-
정적 생성자는 첫 번째 인스턴스가 생성되거나 정적 멤버가 참조되기 전에 클래스를 초기화하기 위해 자동으로 호출됩니다. staticconstructor는 인스턴스 생성자보다 먼저 실행됩니다. 형식의 정적 생성자는 할당될 때가 아니라 이벤트 또는 대리자에 할당된 정적 메서드가 호출될 때 호출됩니다. 정적 필드 변수 이니셜라이저가 정적 생성자의 클래스에 있는 경우 정적 생성자의 실행 직전에 클래스 선언에 나타나는 텍스트 순서대로 실행됩니다.
-
정적 필드를 초기화하기 위해 정적 생성자를 제공하지 않으면 모든 정적 필드는 C#types의 기본값에 나열된 기본값으로 초기화됩니다.
-
정적 생성자가 예외를 throw하는 경우 런타임은 이를 다시 호출하지 않으며 프로그램이 실행되는 응용 프로그램 도메인의 수명 동안 형식이 초기화되지 않은 상태로 유지됩니다. 가장 일반적으로 aTypeInitializationException 예외는 정적 생성자가 유형을 인스턴스화할 수 없거나 정적 생성자 내에서 발생하는 처리되지 않은 예외에 대해 발생합니다. 소스 코드에 명시적으로 정의되지 않은 암시적 정적 생성자의 경우 문제 해결을 위해 IL(중간 언어) 코드 검사가 필요할 수 있습니다.
-
정적 생성자가 있으면 BeforeFieldInit 유형 속성을 추가할 수 없습니다. 이것은 런타임 최적화를 제한합니다.
-
정적 읽기 전용으로 선언된 필드는 해당 선언의 일부로 또는 정적 생성자에서만 할당할 수 있습니다. 명시적 정적 생성자가 필요하지 않은 경우 더 나은 런타임 최적화를 위해 정적 생성자를 통하지 않고 선언 시 정적 필드를 초기화하십시오.
예
시스템 사용, 네임스페이스 DemoApplication{ public class Program{ static void Main(string[] args){ 자동차 사용자 =new Car(); 자동차 user1 =new Car(); Console.ReadLine(); } } public class Car{ static Car(){ Console.WriteLine("정적 생성자 호출"); } public Car(){ Console.WriteLine("기본 생성자가 호출됨"); } }}
출력
정적 생성자 호출기본 생성자 호출기본 생성자 호출
위의 예에서 정적 생성자가 한 번만 호출되는 것을 볼 수 있습니다.
예
시스템 사용, System.Threading 사용, 네임스페이스 DemoApplication{ public class Car{ protected static readonly DateTime globalStartTime; 보호된 int RouteNumber { 가져오기; 세트; } 정적 자동차(){ globalStartTime =DateTime.Now; Console.WriteLine($"정적 생성자가 호출되었습니다. 전역 시작 시간:{globalStartTime.ToLongTimeString()}"); } 공공 자동차(int routeNum){ RouteNumber =routeNum; Console.WriteLine($"{RouteNumber} 차량이 생성되었습니다."); } 공개 무효 드라이브(){ TimeSpan elapsedTime =DateTime.Now - globalStartTime; Console.WriteLine($"Car {this.RouteNumber}는 전역 시작 시간 {globalStartTime.ToShortTimeString()} 후 {elapsedTime.Milliseconds}분 후 경로를 시작합니다."); } } 클래스 TestCar{ 정적 무효 Main(){ 자동차 car1 =new Car(1); 자동차 car2 =new Car(2); car1.드라이브(); Thread.Sleep(25); car2.Drive(); Console.ReadLine(); } }}
출력
정적 생성자가 호출되었습니다. 글로벌 시작 시간:7:09:06 AM자동차 1이 생성되었습니다.자동차 2가 생성되었습니다.자동차 1이 글로벌 시작 시간 오전 7:09부터 25분 후에 경로를 시작합니다.자동차 2가 글로벌 시작 시간 오전 7:09 이후 50분 후에 경로를 시작합니다.사전>