C # résout-il automatiquement les dépendances parmi les membres de données statiques?

StackOverflow https://stackoverflow.com/questions/1727301

  •  19-09-2019
  •  | 
  •  

Question

Si un membre de données statique dépend d'un autre membre de données statique, C # /. Net garantit-il que le membre statique dépendant est initialisé avant le membre dépendant?

Par exemple, nous avons une classe comme:

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

Lorsque Foo.b est accessible, est-il toujours "ABCDEF" ou peut être "DEF"?

Si cela n'est pas garanti, existe-t-il un meilleur moyen de s'assurer que le membre dépendant de l'initialisation d'abord?

Était-ce utile?

La solution

Comme dit précédemment, l'initialisation du champ statique est déterministe et va selon l'ordre de la déclaration textuelle.

Prenez ceci, par exemple:

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

Foo.b entraînera toujours "Def".

D'ailleurs, lorsqu'il y a une dépendance entre les champs statiques, il est préférable d'utiliser un initialiseur statique:

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

De cette façon, vous exprimez explicitement votre préoccupation concernant l'ordre d'initialisation; ou la dépendance d'ailleurs (même si le compilateur ne vous aidera pas si vous échangez accidentellement les instructions d'initialisation.) Ce qui précède aura les valeurs attendues stockées dans A et B (respectivement "ABC" et "ABCDEF").

Cependant, les choses peuvent devenir torsadées (et spécifiques à l'implémentation) pour l'initialisation des champs statiques définis dans plusieurs classes. La section 10.4.5.1 Initialisation du champ statique de la spécification de la langue en parle encore plus.

Autres conseils

Il montrera allways "ABCDEF", car l'initialisation descend en haut de la source, aujourd'hui comme avant.

Tous les membres statiques seront initialisés lors du chargement du Classtype qui les maintient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top