2012-08-08 17 views
10

Dati i seguenti classi:Perché un costruttore statico non è invocato su una classe utilizzata come parametro di tipo generico?

public class Foo { 
    static Foo() { 
     Console.WriteLine("Foo is being constructed"); 
    } 
} 

public class Bar { 
    public void ReferenceFooAsGenericTypeParameter<T>() { 
     Console.WriteLine("Foo is being referenced as a generic type parameter"); 
    } 
} 

public class SampleClass 
{ 
    public static void Main() 
    { 
     new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); 
    } 
} 

l'uscita è

Foo is being referenced as a generic type parameter

Questo ha senso, secondo la specifica:

Un costruttore statico viene chiamato automaticamente per inizializzare la classe prima la prima istanza viene creata o qualsiasi membro statico viene referenziato.

Ma sono curioso del motivo per cui il costruttore statico non viene richiamato quando si fa riferimento al tipo come parametro di tipo generico.

+0

Buona domanda amico, questo un po 'me oggi –

risposta

6

Perché dovrebbe essere necessario?

Il punto del costruttore statico chiamato normalmente è quello di assicurarsi che qualsiasi stato impostato all'interno del costruttore statico venga inizializzato prima del primo utilizzo.

Utilizzare semplicemente Foo come argomento di tipo non utilizza alcun stato al suo interno, quindi non è necessario chiamare il costruttore statico.

Si potrebbe desiderare di provare a creare un inizializzatore variabile statica con effetti collaterali (ad esempio una chiamata di metodo che poi stampe alla console) e rimuovendo il costruttore statico - che can affect the timing of initialization significantly in alcuni casi. È può attivarlo qui.

+0

Ho pensato tanto. Grazie per il chiarimento e il link. – arootbeer

1

Questo perché in realtà non è possibile utilizzare il contenuto del tipo in modo significativo solo includendolo come parametro di tipo generico, il tipo deve avere qualcosa da eseguire per garantire che venga chiamato un costruttore statico.

E hai ragione che questo è in linea con le specifiche. Sezione 10.12 (Static Costruttori) afferma:

L'esecuzione di un costruttore statico è innescato dal primo dei seguenti eventi che si verificano all'interno di un dominio applicazione:

· Un'istanza del tipo di classe è creato.

· Viene fatto riferimento a qualsiasi membro statico del tipo di classe.

Utilizzare come parametro di tipo generico non è nessuno di questi.

+0

La domanda riconosce già che il comportamento è conforme alla specifica, ma chiede perché la specifica è scritta così com'è. – hvd

+0

@hvd Grazie, mancato quello. Risposta cambiata –

0

La cosa da notare qui è che in new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); aver creato un oggetto di tipo bar, né il vostro principale né Bar avere creare un'istanza di Foo né ha da suoi membri stato accessibile, nel caso presentato, il digitare se stesso semplicemente passando come parametro.

Problemi correlati