🌍 C# Study/이펙티브 C#
[13] 정적 클래스 멤버를 올바르게 초기화하라
맨텀
2021. 4. 25. 14:50
다음 본문은 도서 이펙티브 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() // 일반 생성자
{
}
}
결론
- 일반 멤버와 동일하게 멤버 초기화 구문을 사용하지만, 예외 발생 가능성이 있다면 정적 생성자를 사용하자.