Sì, il costruttore statico verrà chiamato una volta per ogni tipo di classe chiusa (il tipo creato quando si specificano i parametri del tipo). Vedere il C# 3 specification, §10.12 Costruttori statici.
Il costruttore statico per un tipo di classe chiusa viene eseguito al massimo una volta in un determinato dominio dell'applicazione.
e anche:
Poiché il costruttore statico viene eseguita esattamente una volta per ogni chiuso costruito tipo di classe, è un posto conveniente per imporre controlli runtime sul parametro tipo che non può essere controllato compilare-tempo tramite vincoli (§10.1.5). Ad esempio, il seguente tipo utilizza un costruttore statico per imporre che l'argomento tipo è un'enumerazione:
class Gen<T> where T: struct
{
static Gen() {
if (!typeof(T).IsEnum) {
throw new ArgumentException("T must be an enum");
}
}
}
Inoltre, è importante leggere §4.4.2 aperti e chiusi tipi:
In fase di esecuzione, tutto il codice all'interno di una dichiarazione di tipo generico viene eseguito nel contesto di un tipo costruito chiuso creato applicando argomenti tipo alla dichiarazione generica. Ogni parametro di tipo all'interno del tipo generico è associato a un particolare tipo di runtime. L'elaborazione in fase di esecuzione di tutte le istruzioni e le espressioni avviene sempre con tipi chiusi e i tipi aperti si verificano solo durante l'elaborazione in fase di compilazione.
Ogni tipo chiuso ha il proprio insieme di variabili statiche, che non sono condivise con nessun altro tipo chiuso chiuso.
Questo programma che è possibile eseguire da soli dimostra che il costruttore statico viene chiamato tre volte, non solo una volta:
public class Program
{
class SomeGenericClass<T>
{
static SomeGenericClass()
{
Console.WriteLine(typeof(T));
}
}
class Baz { }
static void Main(string[] args)
{
SomeGenericClass<int> foo = new SomeGenericClass<int>();
SomeGenericClass<string> bar = new SomeGenericClass<string>();
SomeGenericClass<Baz> baz = new SomeGenericClass<Baz>();
}
}
uscita:
System.Int32
System.String
Program+Baz
fonte
2010-05-29 21:00:38
Come è una classe statica? –
@Jouke van der Maas, che ha parlato di una lezione statica? La domanda riguarda il costruttore statico di una classe generica, non una classe statica ... –
Questo non era né, quindi è ancora valido :) –