Statische Konstruktoren (C#-Programmierhandbuch)

Aktualisiert: Juli 2008

Ein statischer Konstruktor wird verwendet, um static-Daten zu initialisieren oder um eine einmalige Handlung auszuführen. Er wird automatisch aufgerufen, bevor die erste Instanz erstellt oder auf statische Member verwiesen wird.

class SimpleClass
{
    // Static variable that must be initialized at run time.
    static readonly long baseline;

    // Static constructor is called at most one time, before any
    // instance constructor is invoked or member is accessed.
    static SimpleClass()
    {
        baseline = DateTime.Now.Ticks;
    }
}

Statische Konstruktoren verfügen über die folgenden Eigenschaften:

  • Ein statischer Konstruktor akzeptiert weder Zugriffsmodifizierer, noch besitzt er Parameter.

  • Er wird automatisch zur Initialisierung der Klasse aufgerufen, bevor die erste Instanz erstellt oder auf beliebige statische Member verwiesen wird.

  • Ein statischer Konstruktor kann nicht direkt aufgerufen werden.

  • Der Benutzer kann nicht steuern, wann der statische Konstruktor im Programm ausgeführt wird.

  • Meistens wird ein statischer Konstruktor verwendet, wenn die Klasse eine Protokolldatei verwendet und mithilfe des Konstruktors Einträge in diese Datei vorgenommen werden.

  • Statische Konstruktoren sind auch beim Erstellen von Wrapperklassen für nicht verwalteten Code nützlich, wenn der Konstruktor die LoadLibrary-Methode aufrufen kann.

  • Wenn ein statischer Konstrukter eine Ausnahme aulöst, wird er zur Laufzeit nicht wieder aufgerufen und der Typ bleibt für die Lebensdauer der Anwendungsdomäne, in der das Programm ausgeführt wird, uninitialisiert.

Beispiel

In diesem Beispiel besitzt die Bus-Klasse einen statischen Konstruktor und einen statischen Member (Drive()). Beim Aufruf von Drive() wird der statische Konstruktor zur Initialisierung der Klasse aufgerufen.

 public class Bus
 {
     // static variable used by all Bus instances
     // Represents the time the first bus of the day starts its route.
     protected static readonly DateTime globalStartTime;

     // Instance readonly variable
     protected int RouteNumber { get; set; }

     // Static constructor to initialize static variable.
     // It is invoked before the first instance constructor is called.
     static Bus()
     {
         globalStartTime = DateTime.Now;
         Console.WriteLine("Static ctor sets global start time to {0}", globalStartTime.ToLongTimeString());
     }

     // Instance constructor
     public Bus(int routeNum)
     {
         RouteNumber = routeNum;
         Console.WriteLine("{0} is created.", RouteNumber);
     }

     // Instance method.
     public void Drive()
     {
         TimeSpan elapsedTime = DateTime.Now - globalStartTime;

         // For demonstration purposes we treat milliseconds as minutes to 
         // simulate actual bus times. Do not do this in your actual bus schedule program!
         Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}.",
                                 this.RouteNumber,
                                 elapsedTime.TotalMilliseconds,
                                 globalStartTime.ToShortTimeString());
     }
 }

 class TestBus
 {
     static void Main()
     {

         Bus bus = new Bus(71);
         bus.Drive();

         // Wait for next bus to warm up.
         System.Threading.Thread.Sleep(25);

         Bus bus2 = new Bus(72);
         bus2.Drive();


         // Keep the console window open in debug mode.
         System.Console.WriteLine("Press any key to exit.");
         System.Console.ReadKey();
     }
 }
 /* Output:
     Static ctor sets global start time to 10:04:08 AM
     71 is created.
     71 is starting its route 21.00 minutes after global start time 10:04 AM.
     72 is created.
     72 is starting its route 46.00 minutes after global start time 10:04 AM.      
*/


Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Konstruktoren (C#-Programmierhandbuch)

Destruktoren (C#-Programmierhandbuch)

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Absatz über Ausnahmen bei statischem Konstruktor hinzugefügt.

Korrektur inhaltlicher Fehler.