본문 바로가기

C#/MSIL

[MSIL] beforefieldinit

beforefieldinit는 타입이 초기화(정적 생성자, cctor)되는 시점을 슈퍼-레이지하게 만들어준다.

슈퍼 레이지하다는것은, 스태틱 메소드중에 필드에 접근하지 않는 애는 호출이 되어도 초기화를 스킵한다는 뜻이다.

위 코드에서 PrintHello는 그냥 HelloWorld만 출력한다.
반면에 PrintHelloWithField는 HelloWorld를 찍은 뒤, 굳이 필드에 일부러 접근하는 동작을 가진다.
마지막으로 정적 생성자가 호출되는 시점을 알 수 있도록 CCTOR라는 메세지를 출력하도록 했다.



위의 코드를 실행하면 단순히 HelloWorld가 출력되는 모습을 볼 수 있는데, 이는 Foo 클래스는 beforefieldinit 속성을 가지고있기 때문에 PrintHello를 불러도 정적 생성자가 호출되지 않기 때문이다.

PrintHello를 호출하는 부분을 PrintHelloWithField로 변경하면 HelloWorld가 출력되기 전에 타입이 초기화되어 CCTOR가 먼저 출력되는것을 볼 수 있다.


Foo 클래스에서 beforefieldinit 빼고 빌드하여 테스트해보면, 슈퍼-레이지 초기화는 없기 때문에 PrintHello를 부르던 PrintHelloWithField를 부르던 타입이 사용되면 무조건 초기화된다.

'C# > MSIL' 카테고리의 다른 글

[MSIL] 람다식의 캡쳐 구현하기  (0) 2016.09.01
CLR에서 돌아가는 언어를 뭔가를 만들어 보면서  (1) 2015.11.17
[MSIL] 런타임 property 구현하기  (1) 2015.11.05
[MSIL] for loop  (1) 2015.11.02