Lorsqu'un type déclare un constructeur statique explicite, le compilateur juste-à-temps (JIT) ajoute une vérification à chaque méthode statique et constructeur d'instance du type pour s'assurer que le constructeur statique a été appelé précédemment. L'initialisation statique est déclenchée lorsqu'on accède à un membre statique ou lorsqu'une instance du type est créée. Cependant, l'initialisation statique n'est pas déclenchée si vous déclarez une variable du type mais ne l'utilisez pas, ce qui peut être important si l'initialisation change l'état global.
Lorsque toutes les données statiques sont initialisées en ligne et qu'un constructeur statique explicite n'est pas déclaré, les compilateurs du langage intermédiaire de Microsoft (MSIL) ajoutent l'attribut beforefieldinit
et un constructeur statique implicite, qui initialise les données statiques, à la définition de type MSIL.
Lorsque le compilateur JIT rencontre l'indicateur beforefieldinit, la plupart du temps, les vérifications des constructeurs statiques ne sont pas ajoutées. L'initialisation statique est garantie à un moment donné avant l'accès à tout champ statique, mais pas avant l'appel d'une méthode statique ou d'un constructeur d'instance. Notez que l'initialisation statique peut se produire à tout moment après la déclaration d'une variable de ce type.
Les vérifications statiques des constructeurs peuvent diminuer les performances. Souvent, un constructeur statique n'est utilisé que pour initialiser des champs statiques, auquel cas vous devez seulement vous assurer que l'initialisation statique a lieu avant le premier accès d'un champ statique. Le comportement beforefieldinit est approprié pour ces types et la plupart des autres types. Il n'est inapproprié que lorsque l'initialisation statique affecte l'état global et que l'une des situations suivantes est vraie :
L'effet sur l'état global est coûteux et n'est pas nécessaire si le type n'est pas utilisé.
On peut accéder aux effets d'état globaux sans accéder aux champs statiques du type.
Pour plus d'informations https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1810