Heim  >  Artikel  >  Backend-Entwicklung  >  Wozu dient der statische Konstruktor in C#?

Wozu dient der statische Konstruktor in C#?

WBOY
WBOYnach vorne
2023-08-23 22:25:02860Durchsuche

Wozu dient der statische Konstruktor in C#?

Der statische Konstruktor wird verwendet, um statische Daten zu initialisieren oder bestimmte Vorgänge auszuführen Der Inhalt, der übersetzt werden muss, ist: Vorgänge, die vor dem ersten Aufruf automatisch ausgeführt werden Wenn eine Instanz erstellt oder auf ein statisches Mitglied verwiesen wird.

Statische Konstruktoren sind sehr nützlich beim Erstellen von Wrapper-Klassen für nicht verwalteten Code. Wenn der Konstruktor die LoadLibrary-Methode aufrufen kann. Das Gleiche gilt für statische Konstruktoren Praktischer Ort zum Erzwingen von Typparametern, die zur Laufzeit nicht überprüft werden können Die Einschränkungen werden zur Kompilierzeit überprüft.

Der statische Konstruktor hat die folgenden Eigenschaften: −

  • Der statische Konstruktor akzeptiert keine Zugriffsmodifikatoren oder Parameter.

  • Eine Klasse oder Struktur kann nur einen statischen Konstruktor haben.

  • Statische Konstruktoren können nicht vererbt oder überladen werden.

  • Statischer Konstruktor kann nicht direkt aufgerufen werden, er kann nur über andere Methoden aufgerufen werden

Common Language Runtime (CLR). Es wird automatisch aufgerufen.
  • Der Benutzer hat keine Kontrolle darüber, wann der statische Konstruktor ausgeführt wird Programm.

  • Der statische Konstruktor wird automatisch aufgerufen, bevor die Klasse initialisiert wird Die erste Instanz wird erstellt oder referenziert alle statischen Mitglieder. eine Statik Der Konstruktor wird vor dem Instanzkonstruktor ausgeführt. statischer Konstruktor des Typs Wird aufgerufen, wenn eine statische Methode einem Ereignis oder Delegaten zugewiesen und aufgerufen wird Und nicht, wenn es zugewiesen wird. Wenn ein statischer Feldvariableninitialisierer vorhanden ist Klasse des statischen Konstruktors werden sie in der Textreihenfolge in ausgeführt Eine Klasse mit statischen Konstruktoren, die in Textreihenfolge ausgeführt werden Sie erscheinen vor der Ausführung in der Klassendeklaration Wenn Sie keinen statischen Konstruktor zum Initialisieren statischer Felder bereitstellen, werden alle statischen Felder beim ersten Zugriff automatisch in der Reihenfolge initialisiert, in der sie deklariert wurden.

  • Felder werden mit ihren unter „Standardwerte in C#“ aufgeführten Werten initialisiert. Wenn ein statischer Konstruktor eine Ausnahme auslöst, wird diese von der Laufzeit nicht aufgerufen Beim zweiten Mal bleibt der Typ während seiner gesamten Lebensdauer nicht initialisiert Die Anwendungsdomäne, in der Ihr Programm ausgeführt wird. Am häufigsten ist a TypeInitializationException tritt auf, wenn ein statischer Konstruktor ausgelöst wird Der Typ kann nicht instanziiert werden oder es tritt eine nicht behandelte Ausnahme auf Statischer Konstruktor. Für implizite statische Konstruktoren, die nicht explizit definiert sind Im Quellcode definiert, kann die Fehlerbehebung eine Überprüfung erfordern Intermediate Language (IL)-Code.
  • Das Vorhandensein eines statischen Konstruktors verhindert das Hinzufügen Eigenschaft vom Typ BeforeFieldInit. Dadurch wird die Laufzeitoptimierung eingeschränkt.

  • Ein als statisch schreibgeschützt deklariertes Feld kann nur als Teil davon zugewiesen werden in einer Deklaration oder einem statischen Konstruktor. Wenn es keinen expliziten statischen Konstruktor gibt Der Inhalt, der übersetzt werden muss, ist: erforderlich, initialisieren Sie statische Felder bei der Deklaration und nicht durch eine statische Der Inhalt, der übersetzt werden muss, ist: erforderlich, initialisieren Sie statische Felder bei der Deklaration und nicht durch eine statische Konstruktoren werden zur besseren Laufzeitoptimierung verwendet.

  • Beispiel

    Live-Demonstration

    using System;
    namespace DemoApplication{
       public class Program{
          static void Main(string[] args){
             Car user = new Car();
             Car user1 = new Car();
             Console.ReadLine();
          }
       }
       public class Car{
          static Car(){
             Console.WriteLine("Static constructor called");
          }
          public Car(){
             Console.WriteLine("Default constructor called");
          }
       }
    }

    Ausgabe

    Static constructor called
    Default constructor called
    Default constructor called

    Im obigen Beispiel können wir sehen, dass der statische Konstruktor nur einmal aufgerufen wird.

    Beispiel

    Online-Demonstration

    using System;
    using System.Threading;
    namespace DemoApplication{
       public class Car{
          protected static readonly DateTime globalStartTime;
          protected int RouteNumber { get; set; }
          static Car(){
             globalStartTime = DateTime.Now;
             Console.WriteLine($"Static constructor called. Global start time:
             {globalStartTime.ToLongTimeString()}");
          }
          public Car(int routeNum){
             RouteNumber = routeNum;
             Console.WriteLine($"Car {RouteNumber} is created.");
          }
          public void Drive(){
             TimeSpan elapsedTime = DateTime.Now - globalStartTime;
             Console.WriteLine($"Car {this.RouteNumber} is starting its route
             {elapsedTime.Milliseconds} minutes after global start time
             {globalStartTime.ToShortTimeString()}.");
          }
       }
       class TestCar{
          static void Main(){
             Car car1 = new Car(1);
             Car car2 = new Car(2);
             car1.Drive();
             Thread.Sleep(25);
             car2.Drive();
             Console.ReadLine();
          }
       }
    }

    Ausgabe

    Static constructor called. Global start time:
    7:09:06 AM
    Car 1 is created.
    Car 2 is created.
    Car 1 is starting its route25 minutes after global start time7:09 AM.
    Car 2 is starting its route50 minutes after global start time7:09 AM.

    Das obige ist der detaillierte Inhalt vonWozu dient der statische Konstruktor in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen