Lorsque j'ai une classe contenant un constructeur statique, ce constructeur est-il appelé lorsque l'assembly contenant la classe est chargé pour la première fois ou lorsque la première référence à cette classe est atteinte?
Réponses:
Lorsque la classe est accédée pour la première fois.
Constructeurs statiques (Guide de programmation C #)
Un constructeur statique est utilisé pour initialiser toutes les données statiques ou pour effectuer une action particulière qui ne doit être effectuée qu'une seule fois. Il est appelé automatiquement avant que la première instance ne soit créée ou que des membres statiques soient référencés.
A static constructor is used to initialize any static data
NON. Mieux vaut l'utiliser static initializer
pour initialiser des éléments statiques.
Ce n'est pas aussi simple que vous pourriez vous y attendre malgré une documentation simple. L'article de Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx aborde cette question en détail.
Sommaire:
Le constructeur statique est garanti pour être exécuté immédiatement avant la première référence à un membre de cette classe - soit la création de l'instance ou la propre méthode statique / propriété de classe.
Notez que les initiateurs statiques (s'il n'y a pas de constructeur statique) garantissent d'être exécutés à tout moment avant la première référence à un champ particulier.
Le constructeur statique est appelé avant que vous n'utilisiez quoi que ce soit dans la classe, mais exactement quand cela se produit dépend de l'implémentation.
Il est garanti qu'il sera appelé avant l'accès au premier membre statique et avant la création de la première instance. Si la classe n'est jamais utilisée, le constructeur statique n'est pas du tout garanti d'être appelé.
Dans le cas où une méthode statique est appelée à partir de la classe parent, le constructeur statique ne sera pas appelé, bien qu'il soit explicitement spécifié. Voici un exemple que le constructeur b n'est pas appelé si b.methoda () est appelé.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Il semble y avoir un piège avec les constructeurs statiques qui est répondu ailleurs mais qui a pris un certain temps à digérer dans une explication simple. Tous les documents et explications affirment que le constructeur statique / les initiateurs sont «garantis» de s'exécuter avant que la première classe ne soit instanciée ou que le premier champ statique ne soit référencé. Le gotcha entre lorsque vous essayez de mettre un singleton statique dans la classe qui crée une instance de lui-même (poulet / œuf). Dans ce cas, le constructeur statique finit par être appelé après le constructeur d'instance - et dans mon cas, le constructeur d'instance contenait du code qui reposait sur des données statiques.
Constructeur statique appelé après le constructeur d'instance?
(la réponse pour moi était de placer le singleton dans une classe distincte ou d'initialiser manuellement les données statiques dans le constructeur d'instance avant que cela ne soit requis)