2021
04.25

다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.

 

 

정적 변수(static)을 포함한다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화해야 한다.

정적 변수 초기화에는 정적 멤버 초기화, 정적 생성자 두 가지 선택지가 존재한다.

정적 필드를 초기화하는 게 큰 작업이라면 Lazy<T>를 사용하여 초기화 작업을 미룰 수 있다.

 

정적 멤버 초기화

 - 일반 필드의 멤버 초기화와 같이 간단하게 초기화할 때 사용할 수 있다.

 - 정적 생성자가 호출되기 이전에 실행되며, 베이스 클래스의 정적 생성자보다도 먼저 호출된다.

 - 예외를 처리하지 못하기 때문에 예외 발생 가능성이 있다면 정적 생성자를 사용하자.

public class MySingleton
{
    private static readonly MySingleton instance = new MySIngleton();
    
    private MySingleton()
    {
    }
}

 

정적 생성자

 - 첫 번째 인스턴스가 만들어지거나 정적 멤버가 참조되기 전에 자동으로 호출된다.

 - 정적 생성자는 한정자를 사용하거나 매개변수를 갖지 않는다.

 - 정적 생성자는 한 개만 존재하며, 상속하거나 오버로드할 수 없다.

 - 예외가 발생한다면 TypeInitilizationException과 함께 에러가 발생한다.

public class MySingleton
{
    private static readonly MySingleton instance;
    
    static MySingleton() // 정적 생성자
    {
        instance = new MySingleton();
    }
    
    private MySingleton() // 일반 생성자
    {
    }
}

 

결론

 - 일반 멤버와 동일하게 멤버 초기화 구문을 사용하지만, 예외 발생 가능성이 있다면 정적 생성자를 사용하자. 

 

 

 

COMMENT