Maison >développement back-end >C++ >L'ordre d'initialisation des classes statiques de C# est-il prévisible ?

L'ordre d'initialisation des classes statiques de C# est-il prévisible ?

DDD
DDDoriginal
2025-01-04 20:15:41949parcourir

Is C#'s Static Class Initialization Order Predictable?

L'ordre d'initialisation des classes statiques en C# est-il déterministe ?

L'ordre d'initialisation des classes statiques en C# est en effet déterministe. Selon la norme ECMA-334 :

  • Les initialiseurs de champs statiques sont exécutés immédiatement avant le constructeur statique.
  • L'exécution d'un constructeur statique est déclenchée par la première utilisation d'un champ statique ou lorsqu'une instance de la classe est créée.
  • Si la classe contient Main(), son constructeur statique s'exécute avant que Main() ne soit appelé.

Exemple d'ordre d'initialisation

Considérez le code suivant :

static class B
{
    public static int X = 7;
    static B()
    {
        Console.WriteLine("B.X = " + X);
        X = A.X;
        Console.WriteLine("B.X = " + X);
    }
}

static class A
{
    public static int X = B.X + 1;
    static A() { Console.WriteLine("A.X = " + X); }
}

static class Program
{
    static void Main()
    {
        Console.WriteLine("A = {0}, B = {1}", A.X, B.X);
    }
}

Ordre d'exécution

  1. A.X est utilisé dans Main(), déclenchant l'initialisation de A().
  2. L'initialisation de A().X nécessite B.X, appelant B().
  3. B().X est initialisé à 7 (Console.WriteLine("B.X = 7") ).
  4. B().X est modifié et Console.WriteLine("B.X = 0") est exécuté.
  5. A().X est défini sur B.X 1 (Console.WriteLine("A.X = 1")).
  6. Console.WriteLine("A = 1, B = 0") est affiché.

Considérations sur le réarrangement

Même si les classes A et B sont réorganisées, l'ordre de l'initialisation reste la même car la première utilisation de A.X déclenche la chaîne d'initialisation.

Conclusion

L'ordre d'initialisation de la classe statique est déterministe et suit les règles décrites dans l'ECMA -Norme 334. La première utilisation d'un membre statique ou la création d'une instance déclenchera le processus d'initialisation, qui se déroule dans l'ordre des initialiseurs de champ suivis du constructeur statique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn