static Constructor에 대한 뒤늦게 알게된 점

평소에 생각없이(?) 코딩하다가 최근에 WPF 스터디를 진행하면서 CustomControl를 만들때
아래의 코드로 항상 시작하는 것을 보게 되었는데요.

public class MyCustomControl : Control
{
    static MyCustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));
    }

    // Add your custom properties, events, and methods here
}

static MyCustomControl() 생성자는 언제 실행이 될까 하는 거였습니다.
chatGPT에도 물어보고 했지만, 결국 답은 MSDN에 있었네요.

이런 기본적인 것을 생각해본적이 없으니…

7개의 좋아요

링크하신 문서에도 있는 거지만

static 자체가 lazy 하게 동작하기 때문에 그 lazy하게 동작하는 시점에서 생성자가 호출된다고 이해하시면 보시는 분들이 좋을 것 같습니다

3개의 좋아요

링크 주신 글 읽어보고 키워드 뽑아서 번역기 돌린 것 공유 드립니다!

A static constructor is used to initialize any static data, or to perform a particular action that needs to be performed only once. It is called automatically before the first instance is created or any static members are referenced. A static constructor will be called at most once.

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

Static constructor is called at most one time, before any instance constructor is invoked or member is accessed.

정적 생성자는 인스턴스 생성자가 호출되거나 멤버에 액세스하기 전에 최대 한 번만 호출됩니다.

The sample output verifies that the static constructor runs only one time, even though two instances of Bus are created, and that it runs before the instance constructor runs.

샘플 출력에서는 Bus의 인스턴스가 두 개 생성되더라도 정적 생성자가 한 번만 실행되고 인스턴스 생성자가 실행되기 전에 정적 생성자가 실행되는 것을 확인할 수 있습니다.

3개의 좋아요

위 MSDN 문서에 개인적으로 하단에 있는 Remark 부분이 중요하다고 생각합니다.

  • 정적 생성자에는 다음과 같은 속성이 있습니다:

  • 정적 생성자는 액세스 수정자를 받거나 매개변수를 갖지 않습니다.

  • 클래스나 구조체에는 정적 생성자가 하나만 있을 수 있습니다.

  • 정적 생성자는 상속하거나 오버로드할 수 없습니다.

  • 정적 생성자는 직접 호출할 수 없으며 공용 언어 런타임(CLR)에서만 호출할 수 있습니다. 자동으로 호출됩니다.

  • 사용자는 프로그램에서 정적 생성자가 언제 실행되는지 제어할 수 없습니다.

  • 정적 생성자는 자동으로 호출됩니다. 첫 번째 인스턴스가 생성되거나 해당 클래스에서 선언된 정적 멤버(기본 클래스가 아님)가 참조되기 전에 클래스를 초기화합니다. 정적 생성자는 인스턴스 생성자보다 먼저 실행됩니다. 정적 필드 변수 이니셜라이저가 정적 생성자의 클래스에 있는 경우 클래스 선언에 표시된 텍스트 순서대로 실행됩니다. 이니셜라이저는 정적 생성자가 실행되기 직전에 실행됩니다.

  • 정적 필드를 초기화할 정적 생성자를 제공하지 않으면 모든 정적 필드는 C# 유형의 기본값에 나열된 대로 기본값으로 초기화됩니다.

Translated with DeepL

5개의 좋아요

너무나도 익숙한 샘플코드네유 ㅋ

1개의 좋아요

맞는 말이긴 한데, 그래도 BCL에 메서드가 있긴 합니다.

RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle) Method (System.Runtime.CompilerServices) | Microsoft Learn

5개의 좋아요