Was macht beforefieldinit flag? Wenn ich in die IL meiner Klasse schaue, sehe ich diese Flagge, aber ich weiß nicht, was diese Flagge tatsächlich tut?
Siehe meinen Artikel zu diesem Thema.
Grundsätzlich beforefieldinit
bedeutet dies , dass "der Typ zu jedem Zeitpunkt initialisiert werden kann, bevor auf statische Felder verwiesen wird". Theoretisch bedeutet dies, dass es sehr träge initialisiert werden kann. Wenn Sie eine statische Methode aufrufen, die keine Felder berührt, muss die JIT den Typ nicht initialisieren.
In der Praxis bedeutet dies, dass die Klasse früher initialisiert wird als sonst - es ist in Ordnung, dass sie zu Beginn der ersten Methode initialisiert wird, die sie möglicherweise verwendet. Vergleichen Sie dies mit Typen, die nicht auf sie beforefieldinit
angewendet wurden, wobei die Typinitialisierung unmittelbar vor der ersten tatsächlichen Verwendung erfolgen muss.
Nehmen wir also an, wir haben:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Wenn beide Typen auf sie beforefieldinit
angewendet wurden (was in C # standardmäßig der Fall ist, es sei denn, der Typ verfügt über einen statischen Konstruktor), werden beide zu Beginn der DoSomething
Methode initialisiert (normalerweise - dies ist nicht garantiert). Wenn dies nicht der Fall ist, wird beforefieldinit
nur einer von ihnen basierend auf dem Flag initialisiert.
Aus diesem Grund wird bei der Implementierung des Singleton-Musters häufig ein statischer Konstruktor (sogar ein leerer!) Verwendet .
Sieht so aus, als würde sich das in 4.6 ändern
https://github.com/dotnet/coreclr/issues/1193
quelle
beforefieldinit
oder nicht)?