2010-05-29 23 views
41

Sarà un costruttore statico su una classe generica essere eseguito per ogni tipo si passa nel parametro generico come questo:C# statico generico costruttore

class SomeGenericClass<T> 
{ 
     static List<T> _someList; 
     static SomeGenericClass() 
     { 
      _someList = new List<T>(); 
     } 
} 

Esistono spalle di disegnare a utilizzare questo approccio?

risposta

52

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 
+0

Come è una classe statica? –

+5

@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 ... –

+0

Questo non era né, quindi è ancora valido :) –

0

Sì, i membri statici e i costruttori per i tipi generici sono specifici per un parametro generico e verranno eseguiti per ogni tipo diverso. Non ci sono veri svantaggi. Basta fare attenzione quando si refactoring una classe non generica in una generica.

0

Sì, verrà eseguito per ogni tipo fornito, poiché per ogni tipo di fornitura diverso si ottiene il tipo separato.

2

che funzionerà, ma un nuovo 'istanza' verrà creata per ogni tipo che usi.

Problemi correlati