Introduzione a C # Generics
Quindi, qual è il concetto di Generics in C #? In parole semplici, è il concetto di definizione di classi, interfacce, metodi, delegati, proprietà indipendenti dal tipo, ecc. Ciò significa che è possibile definire una classe generica o un corpo del metodo e fornire il tipo effettivo durante l'invocazione.
Pertanto, i generici sono come modelli di codice. Consentono di scrivere un blocco di codice sicuro di tipo senza fare riferimento a un particolare tipo di dati. Il tipo di codice viene determinato in fase di compilazione durante la chiamata di chiamata per la classe o il metodo.
Sintassi di Generics in C #
Esaminiamo la sintassi di una dichiarazione generica in C #. È una sintassi molto semplice.
Come pratica comune, la lettera "T", maiuscola e racchiusa tra parentesi angolari, indica la dichiarazione di un codice generico in C #. Ma questo non è il mandato. Qualsiasi lettera maiuscola racchiusa tra parentesi angolari può essere utilizzata per indicare un codice generico.
Dichiarazione di una classe generica:
public class MyGenericClass
Creare un'istanza di una classe generica:
MyGenericClass = new MyGenericClass();
Dichiarazione di una classe derivata generica:
public class MyGenericDerivedClass : MyGenericBaseClass
Dichiarazione di un metodo generico:
public T MyGenericMethod(T item);
Come funzionano i generici in C #?
Quando si dichiara un codice generico in C #, il compilatore produce un modello equivalente a quel codice. Questo modello viene verificato per tutti gli errori di compilazione tranne la sicurezza del tipo. Il passo successivo arriva quando il codice generico viene invocato o chiamato in un'altra parte del programma. Al momento dell'invocazione, si specifica il tipo con cui verrà compilato il codice generico. Quando il compilatore raggiunge il punto di chiamata, inserisce il tipo specificato nel modello precedentemente compilato. Questo viene quindi ricompilato per verificare la sicurezza del tipo. Una volta passato, il codice è pronto per l'esecuzione.
Vedremmo il codice compilato negli esempi seguenti per comprendere meglio i modelli generici.
Esempio di generici in C #
Di seguito sono riportati i diversi esempi di C # Generics:
Generici con classe
Codice:
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList;
public GenericClass()
(
genericList = new List();
)
public void AddToList(T item)
(
genericList.Add(item);
)
public void DisplayList()
(
foreach (var ele in genericList)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass intGenericObj = new GenericClass();
GenericClass stringGenericObj = new GenericClass();
intGenericObj.AddToList(28);
intGenericObj.AddToList(999);
intGenericObj.AddToList(0);
intGenericObj.AddToList(-123);
intGenericObj.AddToList(100);
stringGenericObj.AddToList("Hello");
stringGenericObj.AddToList("Bonjour");
stringGenericObj.AddToList("Ola");
stringGenericObj.AddToList("Ciao");
stringGenericObj.AddToList("Hallo");
intGenericObj.DisplayList();
Console.WriteLine("\n");
stringGenericObj.DisplayList();
))
Produzione:
Lo stesso codice può anche essere riscritto come di seguito. Ciò illustra il potere di definire una classe generica che può essere resa sicura dai tipi per più tipi in un singolo oggetto.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(T item1, U item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Produzione:
Codice compilato:
Per avere una prospettiva di come il tipo di dati viene risolto in Generics, esaminiamo il codice compilato generato quando creiamo un'istanza della classe con numeri interi e tipi di stringa nell'esempio precedente.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(int item1, string item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Generici con metodo
Codice:
using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
int() intArr = (12, 23, 43, 94, 35);
double() doubleArr = (12.3, 45.6, 98.7, 1.45, 82.653);
string() strArr = ("Hello", "Bonjour", "Ola", "Ciao", "Hallo");
Console.WriteLine("The largest integer in the array is (0)", findMax(intArr));
Console.WriteLine("The largest floating-point number in the array is (0)", findMax(doubleArr));
Console.WriteLine("The largest string in the array is (0)", findMax(strArr));
)
static T findMax(T() items)
where T : IComparable
(
T max = items(0);
int position = 0;
for (int i = 1; i < items.Length; i++)
(
if (items(i).CompareTo(max) > 0)
(
max = items(i);
position = i;
)
)
return max;
)
)
Produzione:
Lo spazio dei nomi System.Collections.Generic
Lo spazio dei nomi System.Collections.Generic in C # contiene interfacce e classi che definiscono le raccolte generiche. Consentono ai programmatori di creare raccolte generiche con prestazioni migliori e tipi fortemente simili alle raccolte non generiche.
Questo spazio dei nomi contiene elenchi, dizionari, elenchi collegati, hash, coppie di valori-chiave, pile, ecc., Tutti di natura generica. I programmatori possono implementarli nel loro codice.
Importanza di C # Generics
Di seguito è riportata l'importanza di Generics C # come segue:
- I generici consentono la riusabilità del codice: il principio fondamentale di una buona programmazione. Non è necessario scrivere lo stesso codice per ciascun tipo di dati previsto. È sufficiente definire un codice indipendente dal tipo e indicare al compilatore che il tipo di dati effettivo verrà fornito al momento dell'invocazione del codice.
- Prevenire il costo del pugilato e del non boxe: ovviamente, l'uso dei generici può essere aggirato attraverso la classe di oggetti. I due seguenti codici sono equivalenti nei loro compiti.
Codice generico: public T MyFunc (oggetto T);
Codice non generico: oggetto pubblico MyFunc (oggetto oggetto)
La classe di oggetti sostituisce tutte le classi e quindi il codice non generico di cui sopra può essere utilizzato anche per generare modelli di codice indipendenti dal tipo.
Ma c'è un enorme divario di prestazioni tra i due codici. L'uso della classe di oggetti comporta un costo aggiuntivo di inscatolamento e unboxing dei tipi di dati. I generici lo eliminano e sono quindi migliori nelle prestazioni.
Conclusione
Quindi, abbiamo visto come i generici siano una caratteristica di programmazione indispensabile. Questo è un concetto molto utile, non solo in C # ma nella maggior parte dei linguaggi di programmazione moderni.
Inoltre, si consiglia vivamente di conoscere lo spazio dei nomi System.Collections.Generic in C #. Inoltre, per comprendere le prestazioni dei farmaci generici, approfondisci il modo in cui boxe e unboxing hanno un impatto sulla memoria e sui tempi di esecuzione.
Articoli consigliati
Questa è una guida a C # Generics. Qui discutiamo dell'importanza e di come i generici lavorano in C # insieme a diversi esempi e implementazione del codice. Puoi anche consultare i nostri altri articoli suggeriti per saperne di più -
- Confronto testa a testa di C # o operatore
- Sovraccarico e override in Java
- Qual è l'uso del metodo di sovraccarico?
- Come funziona la classe sigillata in C #?
- Tipi ed errori di gestione in JavaScript
- Collezioni PL / SQL | Sintassi, tipi, eccezioni