Statische Konstruktoren (C#-Programmierhandbuch)Static Constructors (C# Programming Guide)

Ein statischer Konstruktor wird verwendet, um static-Daten zu initialisieren oder um eine bestimmte Aktion auszuführen, die nur einmal ausgeführt werden muss.A static constructor is used to initialize any static data, or to perform a particular action that needs to be performed once only. Er wird automatisch aufgerufen, bevor die erste Instanz erstellt oder auf irgendwelche statischen Member verwiesen wird.It is called automatically before the first instance is created or any static members are referenced.

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;
    }
}

AnmerkungenRemarks

Statische Konstruktoren verfügen über folgende Eigenschaften:Static constructors have the following properties:

  • Ein statischer Konstruktor kann nicht über Zugriffsmodifizierer oder Parameter verfügen.A static constructor does not take access modifiers or have parameters.

  • Eine Klasse oder Struktur kann nur einen statischen Konstruktor besitzen.A class or struct can only have one static constructor.

  • Statische Konstruktoren können nicht vererbt oder überladen werden.Static constructors cannot be inherited or overloaded.

  • Ein statischer Konstruktor kann nicht direkt aufgerufen werden und ist nur für den Aufruf durch die Common Language Runtime (CLR) gedacht.A static constructor cannot be called directly and is only meant to be called by the common language runtime (CLR). Er wird automatisch aufgerufen.It is invoked automatically.

  • Der Benutzer hat keine Kontrolle, wenn der statische Konstruktor im Programm ausgeführt wird.The user has no control on when the static constructor is executed in the program.

  • Ein statischer Konstruktor wird automatisch zum Initialisieren von class aufgerufen, bevor die erste Instanz erzeugt wird oder auf irgendwelche statischen Member verwiesen wird.A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced. Ein statischer Konstruktor wird vor einem Instanzkonstruktor ausgeführt.A static constructor will run before an instance constructor. Beachten Sie, dass der statische Konstruktor eines Typs aufgerufen wird, wenn eine statische Methode, die einem Ereignis oder Delegaten zugewiesen ist, aufgerufen wird. Dies erfolgt nicht während der Zuweisung.Note that a type's static constructor is called when a static method assigned to an event or a delegate is invoked and not when it is assigned. Wenn Variableninitialisierer für statische Felder in der Klasse des statischen Konstruktors vorhanden sind, werden sie direkt vor Ausführung des statischen Konstruktors in der Textreihenfolge ausgeführt, in der sie in der Klassendeklaration vorhanden sind.If static field variable initializers are present in the class of the static constructor, they will be executed in the textual order in which they appear in the class declaration immediately prior to the execution of the static constructor.

  • Wenn Sie keinen statischen Konstruktor zum Initialisieren von statischen Feldern angeben, werden alle statischen Felder mit ihrem Standardwert initialisiert, wie in der Tabelle für Standardwerte aufgeführt.If you don't provide a static constructor to initialize static fields, all static fields are initialized to their default value as listed in the Default Values Table.

  • Wenn ein statischer Konstruktor eine Ausnahme auslöst, wird die Laufzeit ihn kein zweites Mal aufrufen, und der Typ bleibt für die Lebensdauer der Anwendungsdomäne, in der das Programm ausgeführt wird, nicht initialisiert.If a static constructor throws an exception, the runtime will not invoke it a second time, and the type will remain uninitialized for the lifetime of the application domain in which your program is running. Eine TypeInitializationException-Ausnahme wird in aller Regel ausgelöst, wenn ein statischer Konstruktor keinen Typ instanziieren kann oder wenn in einem statischen Konstruktor ein Ausnahmefehler auftritt.Most commonly, a TypeInitializationException exception is thrown when a static constructor is unable to instantiate a type or for an unhandled exception occurring within a static constructor. Bei impliziten statischen Konstruktoren, die im Quellcode nicht explizit definiert sind, ist zur Problembehandlung möglicherweise eine Prüfung des IL-Codes (Intermediate Language, Zwischensprache) erforderlich.For implicit static constructors that are not explicitly defined in source code, troubleshooting may require inspection of the intermediate language (IL) code.

  • Die Existenz eines statischen Konstruktors verhindert die Hinzufügung des BeforeFieldInit-Typattributs.The presence of a static constructor prevents the addition of the BeforeFieldInit type attribute. Dadurch wird die Laufzeitoptimierung eingeschränkt.This limits runtime optimization.

  • Ein als static readonly deklariertes Feld darf nur als Teil der Deklaration oder in einem statischen Konstruktor zugewiesen werden.A field declared as static readonly may only be assigned as part of its declaration or in a static constructor. Wenn ein expliziter statischer Konstruktor nicht erforderlich ist, initialisieren Sie statische Felder in der Deklaration anstatt über einen statischen Konstruktor, um die Laufzeitoptimierung zu verbessern.When an explicit static constructor is not required, initialize static fields at declaration, rather than through a static constructor for better runtime optimization.

Hinweis

Auch wenn auf einen expliziten statischen Konstruktor nicht direkt zugegriffen werden kann, sollte seine Existenz dennoch dokumentiert werden, um bei der Fehlerbehebung von Initialisierungsausnahmen zu helfen.Though not directly accessible, the presence of an explicit static constructor should be documented to assist with troubleshooting initialization exceptions.

VerwendungUsage

  • Eine typische Verwendung statischer Konstruktoren besteht darin, wenn die Klasse eine Protokolldatei verwendet und der Konstruktor verwendet wird, um Einträge in dieser Datei zu schreiben.A typical use of static constructors is when the class is using a log file and the constructor is used to write entries to this file.

  • Statische Konstruktoren sind auch beim Erstellen von Wrapperklassen für nicht verwalteten Code nützlich, wenn der Konstruktor die LoadLibrary-Methode aufrufen kann.Static constructors are also useful when creating wrapper classes for unmanaged code, when the constructor can call the LoadLibrary method.

  • Statische Konstruktoren sind auch eine praktische Möglichkeit, Laufzeitüberprüfungen des Typparameters über Einschränkungen (Typparametereinschränkungen) zu erzwingen, der zur Kompilierzeit nicht überprüft werden kann.Static constructors are also a convenient place to enforce run-time checks on the type parameter that cannot be checked at compile-time via constraints (Type parameter constraints).

BeispielExample

In diesem Beispiel verfügt die Klasse Bus über einen statischen Konstruktor.In this example, class Bus has a static constructor. Wenn die erste Instanz von Bus erstellt wird (bus1), wird der statische Konstruktor zur Initialisierung der Klasse aufgerufen.When the first instance of Bus is created (bus1), the static constructor is invoked to initialize the class. Die Beispielausgabe überprüft, ob der statische Konstruktor nur einmal ausgeführt wird, obwohl zwei Instanzen von Bus erstellt werden, und dass er vor dem Ausführen des Instanzkonstruktors ausgeführt wird.The sample output verifies that the static constructor runs only one time, even though two instances of Bus are created, and that it runs before the instance constructor runs.

 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;

     // Property for the number of each bus.
     protected int RouteNumber { get; set; }

     // Static constructor to initialize the static variable.
     // It is invoked before the first instance constructor is run.
     static Bus()
     {
         globalStartTime = DateTime.Now;

         // The following statement produces the first line of output, 
         // and the line occurs only once.
         Console.WriteLine("Static constructor sets global start time to {0}",
             globalStartTime.ToLongTimeString());
     }

     // Instance constructor.
     public Bus(int routeNum)
     {
         RouteNumber = routeNum;
         Console.WriteLine("Bus #{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.Milliseconds,
                                 globalStartTime.ToShortTimeString());
     }
 }

 class TestBus
 {
     static void Main()
     {
         // The creation of this instance activates the static constructor.
         Bus bus1 = new Bus(71);

         // Create a second bus.
         Bus bus2 = new Bus(72);

         // Send bus1 on its way.
         bus1.Drive();

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

         // Send bus2 on its way.
         bus2.Drive();

         // Keep the console window open in debug mode.
         System.Console.WriteLine("Press any key to exit.");
         System.Console.ReadKey();
     }
 }
 /* Sample output:
     Static constructor sets global start time to 3:57:08 PM.
     Bus #71 is created.
     Bus #72 is created.
     71 is starting its route 6.00 minutes after global start time 3:57 PM.
     72 is starting its route 31.00 minutes after global start time 3:57 PM.      
*/

C#-SprachspezifikationC# language specification

Weitere Informationen finden Sie im Abschnitt Statische Konstruktoren der C#-Sprachspezifikation.For more information, see the Static constructors section of the C# language specification.

Siehe auchSee also