C# 정적 생성자와 기본 생성자 호출 순서
조회수 1353회
class Person
{
static public Person Instance = new Person("Jong");
string name;
static Person()
{
Console.WriteLine("static Person() Called!");
}
public Person(string _name)
{
name = _name;
Console.WriteLine("Person Called!");
}
public void DisplayName()
{
Console.WriteLine(name);
}
}
class Program
{
static void Main(string[] args)
{
Person nPerson = new Person("ABCD");
}
}
C# 7.1 책 기준으로 클래스의 정적 필드의 경우 선언과 동시에 초기화 구문이 있을 경우, 컴파일러가 선언부만 남겨두고, 초기화 구문은 정적 생성자가 없을 경우는 생성, 있을 경우는 그 정적 생성자와 병합하여 코드가 생성되어 컴파일 된다고 적혀있습니다.
그리고 정적 멤버를 처음 호출하거나, 인스턴스 생성자로 생성되어질 경우 정적 생성자가 인스턴스 생성자보다 우선적으로 실행된다고 하더라구요.
위 코드에서 정적 생성자가 언제 호출됬는지를 알아보기 위해
Console.WriteLine("static Person Called!");
이라는 코드를 넣어놨는데
static public Person Instance = new Person("Jong");
위 코드의 초기화 부분인 new Person("Jong") 소스 코드가 정적 생성자와 병합되어 실행되는데, 실행 결과를 보니 Instance의 인스턴스 생성자 실행 -> Person의 정적 생성자 실행 -> nPerson의 인스턴스 생성자 실행 이더라구요.
그러면 소스코드가 아래와 같이 병합된건가요 ?
static Person()
{
Instance = new Person("Jong");
Console.WriteLine("static Person() Called!");
}
그러면 정적 생성자 안의 어떠한 코드가 있어도, 병합될때 초기화 구문은 항상 기존의 코드보다 우선순위로 삽입되는건가요 ?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
네 맞습니다.
무엇이 프로그래머 입장에서 직관적인지 생각해보시면 순서도 유추할 수 있습니다.
만약 정적 생성자의 코드가 정적 필드 초기화보다 먼저 수행된다면 정적 생성자에서 필드 초기화에 쓰인 값을 사용할 수 없을 것입니다.
int a = 42;
라고 했는데a
의 값을 읽으니0
이 나왔다면 저는 프로그래밍을 안했을겁니다.
때문에 순서는- 정적 필드 초기화
- 정적 생성자
- 일반 필드 초기화
- 일반 생성자
이렇게 됩니다. 필드 초기화 코드가 생성자의 코드보다 먼저 수행된다는 내용은 공식 문서에서도 확인하실 수 있습니다.
필드는 개체 인스턴스에 대한 생성자를 호출 하기 직전에 초기화됩니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력