Heim > Backend-Entwicklung > C++ > Ist die Initialisierungsreihenfolge der statischen Klasse von C# vorhersehbar?

Ist die Initialisierungsreihenfolge der statischen Klasse von C# vorhersehbar?

DDD
Freigeben: 2025-01-04 20:15:41
Original
861 Leute haben es durchsucht

Is C#'s Static Class Initialization Order Predictable?

Ist die Reihenfolge der statischen Klasseninitialisierung in C# deterministisch?

Die Reihenfolge der statischen Klasseninitialisierung in C# ist tatsächlich deterministisch. Gemäß ECMA-334-Standard:

  • Statische Feldinitialisierer werden unmittelbar vor dem statischen Konstruktor ausgeführt.
  • Die Ausführung eines statischen Konstruktors wird durch die erste Verwendung eines statischen Felds ausgelöst oder wenn eine Instanz der Klasse erstellt wird.
  • Wenn die Klasse Main() enthält, wird ihr statischer Konstruktor vor Main() ausgeführt aufgerufen.

Beispiel für eine Initialisierungsreihenfolge

Beachten Sie den folgenden Code:

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);
    }
}
Nach dem Login kopieren

Ausführungsreihenfolge

  1. A.X wird in Main() verwendet und löst die Initialisierung von aus A().
  2. A().X-Initialisierung erfordert B.X, Aufruf von B().
  3. B().X wird auf 7 initialisiert (Console.WriteLine("B.X = 7") ).
  4. B().X wird geändert und Console.WriteLine("B.X = 0") wird ausgeführt.
  5. A().X ist auf B.X 1 (Console.WriteLine("A.X = 1") gesetzt.
  6. Console.WriteLine("A = 1, B = 0") wird ausgegeben.

Überlegungen zur Neuordnung

Auch wenn die Klassen A und B neu geordnet werden, bleibt die Reihenfolge von Die Initialisierung bleibt gleich, da die erste Verwendung von A.X die Initialisierungskette auslöst.

Fazit

Die Reihenfolge der statischen Klasseninitialisierung ist deterministisch und folgt den in der ECMA dargelegten Regeln -334-Standard. Die erste Verwendung eines statischen Mitglieds oder die Erstellung einer Instanz löst den Initialisierungsprozess aus, der in der Reihenfolge der Feldinitialisierer gefolgt vom statischen Konstruktor abläuft.

Das obige ist der detaillierte Inhalt vonIst die Initialisierungsreihenfolge der statischen Klasse von C# vorhersehbar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage