Frage

Also hier ist was ich denke ...

public class MyClass
{
    public const string MyConstant = "MyConstantValue";

    private static MyClass DefaultInstance;

    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

Wird diese oder muss ich so etwas wie a verwenden? static readonly Eigentum Feld zum Auslösen des statischen Konstruktors?

War es hilfreich?

Lösung

Die Verwendung einer Konstante führt nicht unbedingt zu einem Zugriff auf Mitglied, das den statischen Konstruktor aufrufen würde. Der Compiler darf (ermutigt, sogar) den Wert der Konstanten zur Kompilierungszeit ersetzen.

Ihre vorgeschlagene Problemumgehung von static readonly Sollte in Ordnung sein, obwohl readonly schlägt ein Feld vor, keine Eigenschaft. Eigenschaften sind schreibgeschützt, wenn sie keinen Setter haben, die readonly Schlüsselwort ist nicht beteiligt.

Ein einfaches Beispiel:

class HasSConstructor
{
    internal const int Answer = 42;
    static HasSConstructor()
    {
        System.Console.WriteLine("static constructor running");
    }
}

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine("The answer is " + HasSConstructor.Answer.ToString());
    }
}

Ausgabe unter .NET 4.0:

Die Antwort ist 42

Der statische Konstruktor läuft nie!

Andere Tipps

Der statische Konstruktor wird automatisch aufgerufen, bevor die erste Instanz erstellt wird oder statische Mitglieder verwiesen werden. Siehe hier: MSDN: Statische Konstruktoren

Übrigens sind konstante Felder von Natur aus statisch, aber wie gezeigt werden sie (und werden wahrscheinlich) durch den Wert selbst ersetzt werden.

Der statische Konstruktor wird nicht aufgerufen, wenn Sie nur auf öffentliche Konstanten zugreifen. Betrachten Sie beispielsweise diese Klasse:

class Testo
{
    public const string MyValue = "Hello, world";
    public static readonly int xyzzy;

    static Testo()
    {
        Console.WriteLine("In static constructor");
        xyzzy = 27;
    }
}

In einer anderen Klasse führen Sie jetzt aus:

Console.WriteLine(Testo.MyValue);
Console.WriteLine(Testo.xyzzy);

Ihre Ausgabe wird sein:

Hello, world
In static constructor
27

Konstanten werden zur Kompilierungszeit aus der Klasse gehisst. Also der Wert von Testo.MyValue bezieht sich nicht auf die Testo Klasse zur Laufzeit. Der statische Konstruktor wird erst aufgerufen, wenn Sie etwas aufrufen, das eine Initialisierung erfordert.

Also, ja, Sie müssen so etwas wie a zugreifen static readonly Wenn Sie sicherstellen möchten, dass der Konstruktor aufgerufen wird.

Nein, du brauchst das nicht. Der statische Konstruktor wird aufgerufen, wenn die Klasse geladen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top