beforefieldinit 플래그는 무엇을합니까? 내 클래스의 IL을 살펴보면이 플래그가 표시되지만이 플래그가 실제로 무엇을하는지 모르겠습니다.
beforefieldinit 플래그는 무엇을합니까? 내 클래스의 IL을 살펴보면이 플래그가 표시되지만이 플래그가 실제로 무엇을하는지 모르겠습니다.
답변:
이 문제에 대한 내 기사 를 참조하십시오 .
기본적으로 beforefieldinit
"정적 필드가 참조되기 전에 언제든지 유형을 초기화 할 수 있습니다."를 의미합니다. 이론적으로 는 매우 느리게 초기화 될 수 있음을 의미합니다. 필드를 건드리지 않는 정적 메서드를 호출하면 JIT가 유형을 초기화 할 필요가 없습니다.
실제로 는 클래스가 초기화되는 것을 의미한다 이전 은 그렇지 않은 것보다 -이 첫 번째 방법의 시작에 초기화하는 것이 괜찮아 수 를 사용합니다. 유형이 비교 하지 않는 한 beforefieldinit
유형의 초기화가 첫 직전에 발생하는 그들에 적용, 실제 사용.
따라서 다음이 있다고 가정합니다.
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
두 유형이 모두 beforefieldinit
적용 되었다면 (C #에서는 유형에 정적 생성자가없는 경우 기본적으로 수행됨) 메서드 시작시 둘 다 초기화됩니다 DoSomething
(보통-보장되지 않음). 그들은이없는 경우 beforefieldinit
만 한 그들 중은 플래그를 기반으로 초기화됩니다.
이것이 싱글 톤 패턴을 구현할 때 정적 생성자를 사용하는 것이 일반적입니다 (빈 생성자라도!) .