2009-11-14 12 views

risposta

54

In pratica la terminologia non importa molto - non riesco a ricordare l'ultima volta che ho dovuto preoccuparmene tranne quando si tenta di scrivere su di esso.

  • Un non legato tipo ha argomenti tipo specificato
  • Un tipo costruito ha almeno un tipo di argomento specificato
  • Un parametro tipo è un tipo aperto
  • Un tipo di matrice in cui il tipo di elemento è aperto è del tipo aperto
  • un aperta tipo costruito ha almeno un argomento tipo che è del tipo aperto
  • Un chiuso tipo è qualsiasi tipo che non è aperto

(Ci sono ulteriori regole per i tipi nidificati. . Consultare la sezione spec C# 3.0 4.4 per dettagli scabrosi)

Come esempio di un tipo di costruzione aperta, prendere in considerazione:

public class NameDictionary<T> : Dictionary<string, T> 

La classe di base di typeof(NameDictionary<>) è:

  • Costruita perché specifica argomenti tipo
  • Aperto perché il secondo argomento di tipo (T) è un tipo aperto

La documentazione MSDN per Type.IsGenericType hanno un tavolino molto utile.

solo ribadire, questo è quasi del tutto irrilevante in uso quotidiano.

Sono generalmente favorevole alla conoscenza della terminologia corretta, in particolare per cose come "passaggio per riferimento" ecc., Ma in questo caso in realtà non si presenta molto spesso. Mi piacerebbe scoraggiarti attivamente dal preoccuparti di questo :)

+0

Ora un giorno la maggior parte delle domande di intervista che ho affrontato sono state poste dal tuo libro. Quindi, per motivi di chiarimento, ho chiesto. :). – user196546

+10

@generixs: Se qualcuno mi chiedesse che in un'intervista, confesserei che non sarei in grado di dire senza consultare un libro o le specifiche :) Non è una domanda di intervista molto utile, devo dire. –

+1

:) dammi una parte del tuo cervello, in modo che io possa rispondere come se fossi un Jon Skeet .. (mi dispiace per aver scherzato ..). – user196546

6

Da MSDN:

Un tipo generico o metodo è chiuso se tipi istanziabili sono stati sostituiti per tutti i suoi parametri di tipo, compresi tutti i parametri di tipo di tutti i tipi racchiudono. È possibile creare un'istanza di un tipo generico solo se è chiusa.

Quindi, questo funziona come List<int> è chiuso:

var list = Activator.CreateInstance(typeof(List<int>)); 

Ma questo genera un'eccezione a run-time, perché List<> è aperta:

var list = Activator.CreateInstance(typeof(List<>)); 
               ↑ 
+2

In questo caso è anche un tipo non associato - un tipo aperto e costruito è il tipo più esoterico :) –

2

Ho usato principalmente generici aperti (fondamentalmente generici non motivati) nelle mappature delle dipendenze. Ad esempio, qualcosa come

Bind<IRepository<>>() 
    .To<BasicRepository<>>() 

Poi, quando il mio costruttore dell'oggetto contiene:

public SomethingController(IRepository<Something>) { ... } 

mio meccanismo di iniezione di dipendenza sarà un'istanza di un BasicRepository < Qualcosa> automagicamente. (Funziona con Ninject e StructureMap e probabilmente con la libreria Castle Windsor, non sono sicuro di altri framework).

+0

'Autofac' supporta anche i tipi generici aperti: [Autofac - creazione di componenti] (https://code.google.com/p/ autofac/wiki/ComponentCreation # Open_Generic_Types) – sgnsajgon

+0

Così come [SimpleInjector] (http://simpleinjector.readthedocs.org/en/latest/advanced.html#registration-of-open-generic-types) –