Software Development/C#

[Effective C#] C# 정적 클래스 멤버 초기화 유의사항

huiyu 2020. 12. 31. 06:00

정적 멤버 변수를 포함하는 타입이 있다면 인스턴스를 생성하기 전 반드시 정적 멤버 변수를 초기화 하여야한다.
C#에선 '정적 멤버 초기화'와 '정적 생성자' 두가지를 제공한다.
* 정적 변수를 초기화하기 위해 인스턴스 생성자나 전용의 private 메서드 혹은 다른 관용구를 사용해서는 안된다.

정적 멤버 초기화

- 인스턴스 멤버 초기화와 마찬가지로 정적 멤버를 간단히 초기화하는 경우라면 정적 생상자보단 멤버 초기화 구문을 사용하는 것이 좋다. 
- 정적 생성자가 호출되기 이전에 실행되며, 베이스 클래스의 정적 생성자보다도 먼저 호출된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MySingleton
{
    private static readonly MySingleton theOneAndOnly = new MySingleton();
 
    public static MySingleton TheOnly
    {
        get 
        {
            return theOneAndOnly
        }
    }
 
    private MySingleton()
    {
    }
    
    // 이하 생략
}
 
cs

 

정적 생성자

- 타입 내에 정의된 모든 메서드, 변수, 속성에 최초로 접근하기 전에 자동으로 호출되는 메서드. 정적 생성자를 활용하면 정적 변수를 초기화하거나, 싱글톤 패턴을 적용하거나, 기타 작업을 효과적으로 수행할 수 있다.

- 멤버 초기화 구문 대신 반드시 정적 생성자를 사용할 경우 : 예외처리가 필요한 경우. 멤버 변수의 경우 예외를 잡을 방법이 없기 때문에 정적 생성자에서 사용해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MySingleton
{
    private static readonly MySingleton theOneAndOnly;
 
    static MySingleton()
    {
        theOneAndOnly = new MySingleton();
    }
 
    public static MySingleton TheOnly
    {
        get
        {
            return theOneAndOnly
        }
    }
 
    private MySingleton()
    {
    }
    
    // 이하 생략
}
cs

* CLR이 특정 타입에 접근해야 하는 경우 정적 생성자를 우선적으로 호출한다. 모든 타입은 정적 생성자를 하나만 가질 수 있으며 어떠한 인자도 넘길 수 없다.

[참고]
Effective C# - 아이템13: 정적 클래스 멤버를 올바르게 초기화하라

728x90