web-dev-qa-db-fra.com

Quelle est la fonction d'un constructeur statique dans une classe non statique?

J'ai remarqué qu'une classe non statique peut avoir un constructeur statique:

public class Thing
{
    public Thing()
    {
        Console.WriteLine("non-static");
    }

    static Thing()
    {
        Console.WriteLine("static");
    }
}

Et lorsque vous initialisez une instance de Thing, le constructeur statique est appelé en premier.

Production:

statique

non statique

Quel en serait le besoin? L'utilisez-vous pour initialiser des champs statiques sur votre instance de type non statique?

Y a-t-il des éléments à prendre en compte lors de l'utilisation d'un constructeur statique?

28
Aage

L'utilisez-vous pour initialiser des champs statiques sur votre instance de type non statique?

À peu près, sauf que les champs statiques (ou les membres statiques de toute nature) ne sont pas associés aux instances; ils sont associés au type lui-même, qu'il s'agisse d'une classe statique ou d'une classe non statique.

documentation répertorie certaines propriétés des constructeurs statiques, dont l'une est:

  • Un constructeur statique est appelé automatiquement pour initialiser la classe avant que la première instance soit créée ou que les membres statiques soient référencés.

Ici, "avant" signifie "immédiatement avant", et selon la première de ces choses. En effet, un constructeur statique n'est appelé qu'une seule fois par type dans une seule exécution de programme.


Y a-t-il des éléments à prendre en compte lors de l'utilisation d'un constructeur statique?

Voici la liste complète donnée par le lien ci-dessus, qui devrait vous donner une idée de ce à quoi vous attendre lors de l'utilisation d'un constructeur statique:

  • Un constructeur statique ne prend pas de modificateurs d'accès ou n'a pas de paramètres.

  • Un constructeur statique est appelé automatiquement pour initialiser la classe avant que la première instance soit créée ou que les membres statiques soient référencés.

  • Un constructeur statique ne peut pas être appelé directement.

  • L'utilisateur n'a aucun contrôle sur le moment où le constructeur statique est exécuté dans le programme.

  • Une utilisation typique des constructeurs statiques est lorsque la classe utilise un fichier journal et que le constructeur est utilisé pour écrire des entrées dans ce fichier.

  • Les constructeurs statiques sont également utiles lors de la création de classes wrapper pour du code non managé, lorsque le constructeur peut appeler la méthode LoadLibrary.

  • Si un constructeur statique lève une exception, le runtime ne l'invoquera pas une seconde fois et le type restera non initialisé pendant la durée de vie du domaine d'application dans lequel votre programme s'exécute.

En plus de vous assurer que vous n'essayez pas d'accéder aux membres non statiques, puisque vous n'êtes pas dans un constructeur d'instance, l'autre chose principale que vous devez considérer est qu'un constructeur statique est toujours appelé à un moment spécifique pendant l'exécution du programme. Comme indiqué, vous ne pouvez pas contrôler cela, sauf en contrôlant quand "la première instance est créée ou tous les membres statiques sont référencés".

29
BoltClock

Depuis MSDN Lien :

Un constructeur statique est appelé automatiquement pour initialiser la classe avant la création de la première instance ou le référencement de tout membre statique.

Comme vous l'avez indiqué, il est utilisé pour initialiser les champs statiques. Vous n'avez qu'à considérer une chose, les champs non statiques ne sont pas initialisés tant que vous n'avez pas créé d'instance de classe.

3
Zaheer Ahmed

Vous l'utilisez pour initialiser ou invoquer des membres statiques de votre classe.

1
Tim Sommer

Il s'agit d'une réponse subjective issue d'une expérience personnelle, mais vous pouvez également l'utiliser pour garantir l'initialisation d'autres variables statiques en dehors de votre classe, dont les membres de votre classe peuvent dépendre.

1
merlin2011
  • Le constructeur statique est appelé automatiquement avant la création de la première instance de la classe.
  • Déclaré en préfixant un mot-clé statique à la définition du constructeur.
  • Il ne peut pas accepter les modificateurs d'accès ni avoir de paramètres.
1
wpzone4u

Comme indiqué par BoltClock est une licorne ci-dessus.

Mais un ajout intéressant est que vous pouvez l'utiliser pour implémenter un Nice Singleton et facilement aussi:

public sealed class Singleton
{
   private static readonly Singleton instance;

   private Singleton() { }

   static Singleton()
   {
      instance = new Singleton()
   }

   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

Plus de détails peuvent être trouvés sur http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi

0
pb.