2008-09-19 8 views
6

Da Wikipedia:Perché C# e VB hanno generici? Che vantaggio offrono? Generics, FTW

programmazione generico è uno stile di programmazione di computer in cui sono scritti algoritmi in termini di to-be-specificato-tardi tipi che sono poi istanziato quando necessario per tipi specifici forniti come parametri ed è stata introdotta da Ada che apparso nel 1983. Questo approccio consente scrittura funzioni comuni o tipi che differiscono solo nel set di tipi in cui operano quando usato, riducendo così la duplicazione.

I generici consentono di definire i tipi specificati in seguito. Non è necessario trasmettere elementi a un tipo per utilizzarli perché sono già stati digitati.

Perché C# e VB hanno generici? Che vantaggio offrono? Quali vantaggi trovi nell'usarli?

Quali altre lingue hanno anche generici?

risposta

6

C# e VB hanno generici per sfruttare il supporto di generici nel sottostante CLR (o è il contrario?). Ti permettono di scrivere codice in un linguaggio tipicamente statico che può essere applicato a più di un tipo di testo senza riscrivere il codice per ogni tipo per il quale lo usi (il runtime lo farà per te) o altrimenti usando System.Object e casting ovunque (come abbiamo avuto a che fare con ArrayList).

Hai letto il article?

Queste lingue hanno anche farmaci generici:

  • C++ (via modelli)
  • Ada (via modelli)
  • Eiffel
  • D (via modelli)
  • Haskell
  • Java
+0

C'è qualche differenza tra generici e modelli. C++, Ada e D hanno quest'ultimo, non sono sicuro del resto. – BCS

+2

I modelli consentono ancora la scrittura con generici, oltre ad altre cose. –

0

L'esempio comune sono le raccolte. per esempio. un insieme di tipo T, come metodo Add (T) e metodo T get(). Stesso codice, diversi tipi di collezioni sicure.

C++, D, Ada e altri hanno modelli, un superset di generici che fanno un bug leggermente diverso ottengono lo stesso risultato finale (e quindi alcuni).

IIRC Java ha generici, ma io non lo faccio Java.

0

Il modo più semplice per spiegarlo è dare un esempio. Supponiamo che tu voglia due hashtables, uno che mappa gli oggetti di tipo string per digitare int e uno che mappa gli oggetti di tipo string per digitare double. È possibile definire Hashtable e quindi utilizzare i tipi K e V. Senza i generici, dovresti usare il tipo di 'oggetto' che, oltre a dover essere espressi per essere significativo, rinuncia alla sicurezza tipografica. Basta istanziare Hashtable e Hashtable e hai i tuoi hash table con il giusto typechecking e tutto.

0

Java ha anche generici. C++ ha modelli.

I linguaggi dinamici come Perl e Javascript non hanno le stesse restrizioni di tipo in modo da ottenere gli stessi vantaggi con meno lavoro.

+0

Non il vantaggio, perché non offrono alcun tipo di sicurezza. – Thomas

+0

C'è molto più beneficio per le raccolte generiche rispetto alla sicurezza del tipo. – Wedge

2

Da MSDN:

Generics forniscono la soluzione ad una limitazione nelle versioni precedenti di Common Language Runtime e il linguaggio C# in cui generalizzazione è realizzata mediante fusione tipi di e dall'universale tipo di base Oggetto. Creando una classe generica, è possibile creare una raccolta protetta da tipo in fase di compilazione .

Leggi il resto di questo articolo per vedere alcuni esempi di come Generics può migliorare la leggibilità e le prestazioni del tuo codice.

5

Personalmente, penso che permettano di risparmiare un sacco di tempo. Uso ancora .NET Framework 1.1 e ogni volta che desideri una raccolta specifica, devi creare una raccolta fortemente tipizzata implementando CollectionBase. Con Generics, devi solo dichiarare la tua collezione come quella List<MyObject> ed è fatta.

2

Probabilmente l'uso più comune per loro è avere elenchi di caratteri fortemente tipizzati. In .NET 1.1, dovresti eseguire il cast di tutto, dall'oggetto al tipo desiderato, o usare qualcosa come CodeSmith per generare un ArrayList fortemente tipizzato.

Inoltre, aiutano a diminuire boxing. Ancora una volta, in .NET 1.x, se si è tentato di utilizzare un ArrayList con un Tipo di valore, si finirebbe con la boxe e si annullerebbero la chiusura degli oggetti in tutto il luogo. I generici evitano questo consentendo di definire il tipo, sia di riferimento che di valore.

ci sono altri usi pratici anche per loro, i gestori di eventi, query LINQ, ecc

1

Generics in .NET sono eccellenti per le collezioni di oggetti. Puoi definire il tuo tipo di oggetto come preferisci ed essere in grado di avere, ad esempio, una lista senza scrivere alcun codice per quello, e avere accesso a tutte le funzionalità efficienti della collezione generica di .NET List pur essendo sicuro per il tipo a T. È roba fantastica.

0

In ogg-C è possibile utilizzare i protocolli per raggiungere gli obiettivi dei generici. Dal momento che il linguaggio è debolmente tipizzato, tuttavia, in genere non è più un problema come quando si combatte il sistema di tipi per utilizzare un percorso di codice per molti tipi.

1

I generici sono basati sul concetto di modelli in C++ se si ha familiarità con essi.

È un modo per implementare un algoritmo o una struttura dati ma ritardare il tipo effettivo su cui è utilizzato.

L'elenco può quindi essere assegnato con qualsiasi tipo di scelta int, stringa e persino i tipi personalizzati a cui è assegnato il tipo durante la costruzione dell'elenco. Ma sarai in grado di utilizzare le operazioni di elenco aggiungi rimuovi ecc.

Puoi davvero risparmiare un sacco di sforzi di codifica abituandoti ai generici. E non devi box e unbox tra i tipi.

Java ha anche generici. Sono chiamati jolly.

1

Generics NET, come metodi di ereditarietà e di estensione, permette una riduzione di duplicazione del codice. Lasciatemi spiegare attraverso il refactoring.

Se tutte le classi con un antenato comune hanno un metodo comune, posizionare il metodo comune nell'antenato comune delle classi (ereditarietà).

Se alcune classi hanno un metodo comune che utilizza un contratto pubblico per ottenere alcuni risultati, rendere il metodo comune in un metodo di estensione su tale contratto pubblico.

Se alcuni diversi metodi o classi hanno lo stesso codice che differisce solo dai tipi applicati (specialmente quando i dettagli del tipo non sono rilevanti per l'operazione del metodo), raccolgono quei metodi o classi in un generico.

1

Aumentano le prestazioni per le raccolte utilizzando i tipi di valore, poiché non sarà richiesto alcun box/unboxing. Sono molto più puliti da usare dato che non dovrete lanciare un oggetto (ad esempio usando ArrayList) al tipo desiderato - e allo stesso modo aiutano a rafforzare la sicurezza del tipo.

3

Considerare questi firme del metodo:

//Old and busted 
public abstract class Enum 
{ 
    public static object Parse(Type enumType, string value); 
} 
//To call it: 
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString); 

//New and groovy 
public abstract class Enum 
{ 
    public static T Parse<T>(string value); 
} 

//To call it: 
MyEnum x = Enum.Parse<MyEnum>(someString); 

ma Aspetto: Nessun tipo di runtime manipolazione.

+0

Adoro il tuo commento su look ma. : D – ferventcoder

1

Il più grande vantaggio dei generici rispetto ai tipi non generici in C# (non Java, Java è una storia diversa) è che sono molto più veloci. Il JIT genera il miglior codice macchina che può generare per un determinato tipo. List<int> è in realtà un elenco di oggetti integer e non interi che racchiudono un int. Questo rende i tipi generici incredibilmente veloci e anche sicuri che possono aiutarti a rilevare un sacco di errori in fase di compilazione :)