.Net: costruttori statici vengono chiamati quando una costante è l'accesso?
-
26-10-2019 - |
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?
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
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.