O que o beforefieldinit flag faz?

O que o beforefieldinit flag faz? Quando eu olho para a IL da minha class eu vejo essa bandeira, mas eu não sei o que esta bandeira está realmente fazendo?

Veja meu artigo sobre este assunto.

Basicamente, beforefieldinit significa “o tipo pode ser inicializado a qualquer momento antes que qualquer campo estático seja referenciado”. Em teoria, isso significa que pode ser inicializado muito preguiçosamente – se você chamar um método estático que não toca em nenhum campo, o JIT não precisa inicializar o tipo.

Na prática, isso significa que a class é inicializada mais cedo do que seria de outra forma – não há problema em ser inicializada no início do primeiro método que possa usá-la. Compare isso com os tipos que não tenham o beforefieldinit aplicado a eles, onde a boot do tipo deve ocorrer imediatamente antes do primeiro uso real .

Então, suponha que tenhamos:

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

Se ambos os tipos tiverem o beforefieldinit aplicado a eles (o que em C # eles fazem por padrão a menos que o tipo tenha um construtor estático) então ambos serão inicializados no início do método DoSomething (geralmente – não é garantido). Se eles não tiverem antes o beforefieldinit , apenas um deles será inicializado, com base na bandeira.

É por isso que é comum usar um construtor estático (mesmo um vazio!) Ao implementar o padrão singleton .

Parece que vai mudar em 4,6

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