Condividi tramite


Differenze tra modelli C++ e generics C# (Guida per programmatori C#)

I generics C# e i modelli C++ sono entrambe funzionalità del linguaggio che forniscono supporto per i tipi con parametri. Tuttavia, esistono molte differenze tra i due. A livello di sintassi, i generics C# sono un approccio più semplice ai tipi con parametri senza la complessità dei modelli C++. Inoltre, C# non tenta di fornire tutte le funzionalità fornite dai modelli C++. A livello di implementazione, la differenza principale è che le sostituzioni di tipi generici C# vengono eseguite in fase di esecuzione e le informazioni sul tipo generico vengono quindi mantenute per gli oggetti di cui è stata creata un'istanza. Per altre informazioni, vedere Generics in runtime.

Di seguito sono riportate le differenze principali tra i generics C# e i modelli C++:

  • I generics C# non offrono la stessa flessibilità dei modelli C++. Ad esempio, non è possibile chiamare operatori aritmetici in una classe generica C#, anche se è possibile chiamare operatori definiti dall'utente.

  • C# non consente parametri di modello non di tipo, ad esempio template C<int i> {}.

  • C# non supporta la specializzazione esplicita; ovvero un'implementazione personalizzata di un modello per un tipo specifico.

  • C# non supporta la specializzazione parziale: un'implementazione personalizzata per un subset degli argomenti di tipo.

  • C# non consente l'uso del parametro di tipo come classe di base per il tipo generico.

  • C# non consente ai parametri di tipo di avere tipi predefiniti.

  • In C#, un parametro di tipo generico non può essere un generico, anche se i tipi costruiti possono essere usati come generics. C++ consente parametri di modello.

  • C++ consente il codice che potrebbe non essere valido per tutti i parametri di tipo nel modello, che viene quindi controllato per il tipo specifico usato come parametro di tipo. C# richiede che il codice in una classe venga scritto in modo che funzioni con qualsiasi tipo che soddisfi i vincoli. Ad esempio, in C++ è possibile scrivere una funzione che usa gli operatori + aritmetici e - sugli oggetti del parametro di tipo, che genererà un errore al momento della creazione di istanze del modello con un tipo che non supporta questi operatori. C# non consente questo; Gli unici costrutti di linguaggio consentiti sono quelli che possono essere dedotti dai vincoli.

Vedere anche