|
Generics C# 2.0
|
Templates C++
|
Istanziazione
|
Compile-Time (JIT)
|
Compile-Time (Preprocessore)
|
Parametri permessi
|
Tutti i value-type, i reference-type a meno di array e puntatori unmanaged e i closed costructed type. Non un altro generic.
|
Tutti i tipi, non-tipi (espressioni costanti, puntatori a funzioni e mebri, riferimeni, ...) e anche un altro template.
|
Tipi di default per i parametri
|
No.
|
Si.
|
Parametro usato come classe base
|
No.
|
Si, è possibile usare un parametro per indicare una classe base del template..
|
Controlli sull'uso dei tipi parametrici
|
Nel codice dei membri del tipo generico è possibile richiamare solo quei membri di un type parameter definiti nei sottotipi (classe base, interfaccie) indicati nei constraints.
|
Nessun vincolo, se si usano membri di un template parameter non presenti nel tipo specificato si ha un errore a Compile-Time.
|
Limitazioni alla specializ. dei membri
|
Non è possibile definire generic methods di tipo: operatori, operatori di conversione, property, indexer, array, events, constructor, destructor e web methods.
|
Nessuna.
|
Identità dei tipi istanziati
|
Identità unica a livello globale: uno stesso generic istanziato da due qualsiasi assembly specificando i medesimi argomenti viene riconosciuto come il medesimo tipo.
|
L'identità di un tipo istanziato è riconosciuta solo all'interno della stesss compilation-unit (assembly).
|
Specializzazione
|
Non è possibile specializzare un generic.
|
Si, è possibile specializzare un template con le
user-specialization e le partial-specialization.
|
Duplicazione in memoria del codice
|
No, in memoria tutte le istanze di uno stesso generic ottenute con parametri reference-type condividono il medesimo codice automaticamente.
|
Si, ma è possibile evitarlo definendo per un template una
user-specialization per tutti parametri di tipo puntatore.
|
Informazioni sui tipi a Run-Time
|
Si, la Reflection supporta i Generics.
|
No, le RTTI non danno informazioni sui template.
|
Supporto cross-language
|
Si, potenzialmente per tutti i linguaggi managed.
|
No.
|