developer tip

beforefieldinit 플래그는 무엇을합니까?

copycodes 2020. 10. 19. 08:12
반응형

beforefieldinit 플래그는 무엇을합니까?


beforefieldinit 플래그는 무엇을합니까? 내 클래스의 IL을 살펴보면이 플래그가 표시되지만이 플래그가 실제로 무엇을하는지 모르겠습니다.


이 문제에 대한 내 기사참조하십시오 .

기본적으로 beforefieldinit"정적 필드가 참조되기 전에 언제든지 유형을 초기화 할 수 있습니다."라는 의미입니다. 이론적으로 이는 매우 느리게 초기화 될 수 있음을 의미합니다. 필드를 건드리지 않는 정적 메서드를 호출하면 JIT가 유형을 초기화 할 필요가 없습니다.

실제로 는 클래스가 초기화되는 것을 의미한다 이전 은 그렇지 않은 것보다 -이 첫 번째 방법의 시작에 초기화하는 것이 괜찮아 를 사용합니다. 유형이 비교 하지 않는beforefieldinit유형의 초기화가 첫 직전에 발생하는 그들에 적용, 실제 사용.

따라서 다음이 있다고 가정합니다.

public static void DoSomething(bool which)
{
    if (which)
    {
        FirstType.Foo();
    }
    else
    {
        SecondType.Bar();
    }
}

두 유형이 모두 beforefieldinit적용된 경우 (C #에서는 유형에 정적 생성자가없는 경우 기본적으로 수행됨) 메서드 시작시 둘 다 초기화됩니다 DoSomething(보통-보장되지 않음). 그들은이없는 경우 beforefieldinit 그들 중은 플래그를 기반으로 초기화됩니다.

이것이 싱글 톤 패턴을 구현할 때 정적 생성자를 사용하는 것이 일반적입니다 (빈 생성자라도!) .


4.6에서 변경 될 것 같습니다.

https://github.com/dotnet/coreclr/issues/1193

참고 URL : https://stackoverflow.com/questions/610818/what-does-beforefieldinit-flag-do

반응형