Domanda

Da Wikipedia:

La programmazione generica è uno stile di programmazione informatica in cui gli algoritmi sono scritti in termini di tipi di later per il futuro che vengono quindi istanziati quando necessario per tipi specifici forniti come parametri e sono stati pionieri da ADA che è apparso nel 1983.Questo approccio consente di scrivere funzioni o tipi comuni che differiscono solo nell'insieme di tipi su cui operano quando utilizzati, riducendo così la duplicazione.

I generici offrono la possibilità di definire i tipi specificati in seguito.Non è necessario eseguire il cast degli elementi in un tipo per utilizzarli perché sono già digitati.

Perché C# e VB hanno i generici?Che vantaggio offrono?Che vantaggi trovi utilizzandoli?

Quali altre lingue hanno anche termini generici?

È stato utile?

Soluzione

C# e VB dispongono di generici per sfruttare il supporto dei generici nel CLR sottostante (o è il contrario?).Ti consentono di scrivere codice in un linguaggio tipizzato staticamente che può applicarsi a più di un tipo di tipo senza riscrivere il codice per ogni tipo per cui li usi (il runtime lo farà per te) o altrimenti usando System.Object e casting ovunque (come abbiamo fatto con ArrayList).

Hai letto il articolo?

Queste lingue hanno anche dei generici:

  • C++ (tramite modelli)
  • Ada (via modelli)
  • Eiffel
  • D (via modelli)
  • Haskell
  • Giava

Altri suggerimenti

Personalmente penso che permettano di risparmiare molto tempo.Sto ancora utilizzando .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 in questo modo List<MyObject> ed è fatto.

Considera queste firme di 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);

Guarda mamma:Nessuna manipolazione del tipo di runtime.

Da MSDN:

I generici forniscono la soluzione a una limitazione nelle versioni precedenti della fascia di esecuzione del linguaggio comune e del linguaggio C# in cui la generalizzazione viene realizzata da tipi di lancio da e verso l'oggetto di tipo base universale.Creando una classe generica, è possibile creare una raccolta che è sicura al tempo di compilazione.

Leggi il resto dell'articolo per vedere alcuni esempi di come i generici possono migliorare la leggibilità e le prestazioni del tuo codice.

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

Inoltre, aiutano a diminuire boxe.Ancora una volta, in .NET 1.x, se provassi a utilizzare un ArrayList con un tipo di valore, finiresti per inscatolare e decomprimere gli oggetti ovunque.I generici lo evitano consentendo di definire il tipo, sia esso riferimento o valore.

Esistono anche altri usi utili per loro, gestori di eventi, query LINQ, ecc.

I generici in .NET sono eccellenti per le raccolte di oggetti.Puoi definire il tipo di oggetto come preferisci ed essere in grado di avere, ad esempio, un List senza scrivere alcun codice per questo e avere accesso a tutte le funzionalità efficienti della raccolta generica .NET List pur essendo indipendente dal tipo per T.È roba fantastica.

I generici si basano sul concetto di modelli in C++ se li conosci.

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

All'elenco può quindi essere assegnato qualsiasi tipo di tua scelta: int, string e persino tipi personalizzati che il tipo viene assegnato 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 è necessario inscatolare e decomprimere tra i tipi.

Anche Java ha dei generici.Si chiamano caratteri jolly.

I generici in .net, come i metodi di ereditarietà ed estensione, consentono di ridurre la duplicazione del codice.Lasciami spiegare tramite il refactoring.

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

Se alcune classi hanno un metodo comune che utilizza un contratto pubblico per ottenere qualche risultato, trasforma il metodo comune in un metodo di estensione su quel contratto pubblico.

Se diversi metodi o classi hanno lo stesso codice che differisce solo per i tipi su cui si agisce (specialmente dove i dettagli del tipo non sono rilevanti per il funzionamento del metodo), raccogliere tali metodi o classi in un file generic.

Aumentano le prestazioni per le raccolte che utilizzano tipi di valore, poiché non sarà richiesto alcun boxing/unboxing.Sono molto più semplici da usare poiché non sarà necessario eseguire il cast di un oggetto (ad esempio utilizzando ArrayList) nel tipo desiderato e allo stesso modo aiutano a rafforzare la sicurezza dei tipi.

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ò ottenere per un dato tipo. List<int> è in realtà un elenco di int e non di oggetti interi che racchiudono un int.Ciò rende i tipi generici incredibilmente veloci e anche sicuri, il che può aiutarti a rilevare un sacco di errori in fase di compilazione :)

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

C++, D, Ada e altri hanno modelli, un superset di generici che fanno un bug leggermente diverso ottenendo lo stesso risultato finale (e anche di più).

IIRC Java ha generici, ma io non faccio Java.

Il modo più semplice per spiegarlo è fare un esempio.Supponiamo che tu voglia due tabelle hash, una che mappa gli oggetti di tipo string sul tipo int e una che mappa gli oggetti di tipo string sul tipo double.Potresti definire Hashtable e quindi utilizzare i tipi K e V.Senza i generici, dovresti usare il tipo 'oggetto' che, oltre a dover essere lanciato per essere significativo, rinuncia alla sicurezza del tipo.Basta creare un'istanza di Hashtable e Hashtable e avrai le tue tabelle hash con il corretto controllo del tipo e tutto il resto.

Java ha anche dei generici.C++ ha modelli.

I linguaggi dinamici come Perl e Javascript non hanno le stesse restrizioni di tipo, quindi ottengono principalmente gli stessi vantaggi con meno lavoro.

Nell'obiettivo C è possibile utilizzare i protocolli per raggiungere gli obiettivi dei farmaci generici.Tuttavia, poiché il linguaggio è tipizzato debolmente, generalmente non è un problema tanto quanto quando si combatte il sistema di tipi per utilizzare un percorso di codice per molti tipi.

Personalmente sono un grande fan dei generici perché non devo scrivere tutto il codice.

Cos'è l'inversione del controllo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top