정적 멤버 변수를 포함하는 타입이 있다면 인스턴스를 생성하기 전 반드시 정적 멤버 변수를 초기화 하여야한다.
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
'Software Development > C#' 카테고리의 다른 글
C# yield 기초 이해하기 (0) | 2021.01.04 |
---|---|
[Effective C#] C# 표준 Dispose 패턴 이해하기 (0) | 2021.01.02 |
[Effective C#]C# 멤버 초기화 - 할당 구문보다 멤버 초기화를 사용한다. (0) | 2020.12.30 |
[Effective C#] C# 가비지 컬렉터(Garbage Collector) 기초 / finalizer 이해하기 (0) | 2020.12.28 |
C# file 및 folder 경로 읽기/쓰기 (0) | 2020.12.10 |