2010-12-21 25 views
3

Ich habe ein paar Fragen zu statischen Konstruktor in C#.Was genau sind statische Konstruktoren in C#?

  1. Was genau sind Static Constructor und wie unterscheiden sie sich von nicht-statischen Konstruktor.
  2. Wie können wir sie in unserer Anwendung verwenden?

* * Herausgegeben

public class Test 
{ 
    // Static constructor: 
    static Test() 
    { 
     Console.WriteLine("Static constructor invoked."); 
    } 

    public static void TestMethod() 
    { 
     Console.WriteLine("TestMethod invoked."); 
    } 
} 

class Sample 
{ 
    static void Main() 
    { 
     Test.TestMethod(); 
    } 
} 

Ausgang: Statische Konstruktor aufgerufen. TestMethod aufgerufen. Das bedeutet also, dass der statische Konstruktor einmal aufgerufen wird. wenn wir Test.TestMethod() erneut aufrufen; Der statische Konstruktor wird nicht aufgerufen.


Alle Zeiger oder einen Vorschlag würde '

Dank

+1

Zum Beispiel werden Sie jedes Mal implizit erzeugt statische Konstrukteuren mit Sie initialisieren ein statisches Feld. –

+0

@ SK-logic: Sie verwenden in dieser Situation keinen implizit erzeugten statischen Konstruktor: Sie verwenden einen Typinitialisierer. Es gibt keinen impliziten statischen Konstruktor. Eine Klasse hat entweder einen expliziten statischen Konstruktor oder keinen statischen Konstruktor. LukeH

+0

Überprüfen Sie die Ausgabe von ildasm/text für jede Klasse mit statischen Feldern, die mit einigen Werten initialisiert sind - Sie sehen dort einen implizit erzeugten statischen Konstruktor. –

Antwort

8

Static constructors sind Konstrukteure zu erkennen, dass nur ONCE, wenn die Klasse ausgeführt werden, geladen wird. Reguläre (nicht statische) Konstruktoren werden jedes Mal ausgeführt, wenn ein Objekt erstellt wird.

Werfen Sie einen Blick auf dieses Beispiel:

public class A 
{ 
    public static int aStaticVal; 
    public int aVal; 

    static A() { 
     aStaticVal = 50; 
    } 

    public A() { 
     aVal = aStaticVal++; 
    } 
} 

Und bedenken Sie diesen Code:

A a1 = new A(); 
A a2 = new A(); 
A a3 = new A(); 

Hier static Konstruktor erste und nur einmal während der Ausführung der heißen Programm. Der reguläre Konstruktor wird dreimal aufgerufen (einmal für jede Objektinstanziierung).

static Konstrukteure sind in der Regel zu tun Initialisierung von statischen Feldern zum Beispiel die Zuweisung eines Anfangswertes zu statischen Feldern .. Sie beachten verwendet, die Sie nur static Mitglieder (Methoden, Eigenschaften und Felder) auf static zuzugreifen in der Lage, Konstruktoren.

Wenn Sie "den statischen Konstruktor mehrmals ausführen müssen", können Sie das nicht tun. Stattdessen können Sie den Code, den Sie ausführen möchten, mehrfach in eine statische Methode einfügen und bei Bedarf aufrufen. Etwas wie:

+1

Statische Konstruktoren übernehmen keine Zugriffsmodifizierer. Sollte nur sein 'static A() {...}' Siehe hier: http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=VS.100).aspx –

+0

@Paul: Danke für das Zeigen das heraus. Mein Fehler. –

+0

@Pablo: Kein Problem. Es sieht und fühlt sich unnatürlich an, keine Zugriffsmods für diesen Fall anzugeben. –

2

Sie verwenden sie auf die gleiche Weise wie Sie Instanzkonstruktoren verwenden - um Standardwerte festzulegen. Nur in diesem Fall initialisieren Sie statische Felder, sodass statische Konstruktoren nur einmal ausgeführt werden.

Beachten Sie, dass der Code im statischen Konstruktor erst beim ersten Aufruf der Klasse ausgeführt wird.

+0

Nicht bis zum ersten Aufruf - aber bis die Klasse geladen ist. Ein statischer Feldzugriff wird es auch auslösen. –

+0

@ SK-Logic Ja, das habe ich gemeint. MSDN-Zitat, um Dinge zu klären: "Ein statischer Konstruktor wird automatisch aufgerufen, um die Klasse zu initialisieren, bevor die erste Instanz erstellt oder auf statische Member verwiesen wird." – Dyppl

1

Es wird ausgeführt, wenn die Klasse geladen ist.

Es druckt: {

  1. hallo von statischen A
  2. A

}

public class A{ 
    static A{ 
    print("hi from static A"); 
    } 

    public A() { 
    print("A"); 
    } 

    main() { 
     new A(); 
    } 
}