Domanda

Così qui è quello che sto pensando ...

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

    private static MyClass DefaultInstance;

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

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

Sarà questo lavoro o ho bisogno di usare qualcosa come un static readonly proprietà campo per innescare il costruttore statico?

È stato utile?

Soluzione

L'uso di una costante non necessariamente ad un accesso membri che causerebbe il costruttore statico da chiamare. Il compilatore è permesso (incoraggiato, pari) sostituire il valore della costante in fase di compilazione.

Il tuo soluzione suggerita di static readonly dovrebbe essere ok, anche se readonly suggerisce un campo, non una proprietà. Le proprietà sono di sola lettura quando non hanno setter, la parola chiave readonly non è coinvolta.

Un semplice esempio:

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

Output sotto .NET 4.0:

La risposta è 42

Il costruttore statico non funziona!

Altri suggerimenti

costruttore

statico viene chiamato prima della creazione della prima istanza o eventuali membri statici vengono riferimento. Vedi qui: MSDN: Statico Costruttori

A proposito, campi costanti sono intrinsecamente statici, ma come punte possono (e probabilmente saranno) sostituiti dal valore stesso.

Il costruttore statico non verrà chiamato se si sta solo accedendo costanti pubbliche. Ad esempio, si consideri questa classe:

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

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

Ora, in un'altra classe, eseguire:

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

L'output sarà:

Hello, world
In static constructor
27

Le costanti sono issato dalla classe al momento della compilazione. Quindi il valore di Testo.MyValue non fa riferimento alla classe Testo in fase di esecuzione. Il costruttore statico non viene chiamato fino a quando si chiama qualcosa che richiede l'inizializzazione.

Quindi, sì, è necessario accedere a qualcosa di simile a un static readonly se si vuole garantire che il costruttore si chiama.

No, non è necessario ad esempio. costruttore statico viene chiamato quando la classe viene caricata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top