C # Generics - Exemple și mod de funcționare a genericilor în C #

Cuprins:

Anonim

Introducere în C # Generics

Deci, care este conceptul de Generics în C #? În cuvinte simple, este conceptul de a defini clase, interfețe, metode, delegați, proprietăți independente de tip, ceea ce înseamnă că puteți defini o clasă generică sau un corp de metodă și să furnizați tipul real în timpul invocării.

Astfel, Generics sunt ca niște coduri-șabloane. Acestea vă permit să scrieți un bloc de cod sigur de tip fără să vă referiți la un anumit tip de date. Tipul codului dvs. este determinat în timp de compilare în timpul apelului de invocare pentru clasa sau metoda dvs.

Sintaxa genericilor în C #

Să ne uităm la sintaxa unei declarații generice din C #. Este o sintaxă foarte simplă.

Ca o practică obișnuită, litera „T”, în majusculă și inclusă între paranteze unghiulare, indică declararea unui cod generic în C #. Dar acesta nu este mandatul. Orice literă cu majusculă inclusă între paranteze unghiulare poate fi folosită pentru a indica un cod generic.

Declararea unei clase generice:

public class MyGenericClass

Instantarea unei clase generice:

MyGenericClass = new MyGenericClass();

Declararea unei clase derivate generice:

public class MyGenericDerivedClass : MyGenericBaseClass

Declararea unei metode generice:

public T MyGenericMethod(T item);

Cum funcționează genericii în C #?

Când declarați un cod generic în C #, compilatorul produce un șablon echivalent cu acel cod. Acest șablon este verificat pentru toate erorile de compilare, cu excepția siguranței de tip. Următorul pas vine atunci când codul generic este invocat sau apelat într-o altă parte a programului. În momentul invocării, specificați tipul cu care va fi compilat codul dvs. generic. Când compilatorul ajunge la punctul de invocare, el introduce tipul specificat în șablonul compilat anterior. Acesta este apoi compilat pentru a verifica siguranța tipului. Odată trecut, codul este pregătit pentru execuție.

Am vedea codul compilat în exemplele de mai jos pentru a înțelege mai bine șabloanele generice.

Exemplu de generice în C #

Mai jos sunt diferite exemple de C # Generics:

Generice cu clasa

Cod:

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();
))

ieşire:

Același cod poate fi re-scris ca mai jos. Acest lucru ilustrează puterea de a defini o clasă generică care poate fi făcută ca sigură pentru mai multe tipuri într-un singur obiect.

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();
)
)

ieşire:

Cod compilat:

Pentru a obține o perspectivă a modului în care tipul de date este rezolvat în Generics, să ne uităm la codul compilat generat când inițiem clasa cu tipuri întregi și șiruri în exemplul de mai sus.

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();
)
)

Generice cu Metoda

Cod:

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;
)
)

ieşire:

System.Collections.space de nume generice

Spațiul de nume System.Collections.Generic din C # conține interfețe și clase care definesc colecțiile generice. Acestea permit programatorilor să creeze colecții generice care să aibă performanțe mai bune și la fel de puternice precum colecțiile non-generice.

Acest spațiu de nume conține liste, dicționare, liste legate, hashes, perechi de valori-cheie, stive etc., toate având natură generică. Programatorii le pot implementa în codul lor.

Importanța genericilor C #

Mai jos este importanța genericilor C # după cum urmează:

  • Generics Allow Code-Reusability: principiul fundamental al unei bune programări. Nu trebuie să scrieți același cod pentru fiecare tip de date preconizat. Pur și simplu definiți un cod independent de tip și spuneți compilatorului că tipul de date propriu-zis ar fi furnizat la momentul invocării codului.
  • Împiedicați costul boxului și dezabordarea: Desigur, utilizarea generice poate fi ocolită prin clasa obiect. Cele două piese de cod de mai jos sunt echivalente în sarcinile lor.

Cod generic: public T MyFunc (articol T);

Cod non-generic: obiect public MyFunc (obiect obiect)

Clasa obiect înlocuiește toate clasele și, astfel, codul non-generic de mai sus poate fi, de asemenea, utilizat pentru a genera șabloane de cod independente de tip.

Dar, există un decalaj imens de performanță între cele două coduri. Utilizarea clasei de obiecte suportă un cost suplimentar pentru boxul și deconectarea tipurilor de date. Genericii elimină acest lucru și astfel sunt mai performanți.

Concluzie

Astfel, am văzut cum genericii sunt o caracteristică de programare trebuie să învețe. Acesta este un concept extrem de util, nu numai în C #, ci în majoritatea limbajelor de programare moderne.

În plus, este foarte recomandat să aflați despre System.Collections.Space de nume generice în C #. De asemenea, pentru a înțelege performanțele generice, aruncați-vă adânc în modul în care box și unboxing au un impact asupra memoriei, precum și timpul de execuție.

Articole recomandate

Acesta este un ghid pentru C # Generics. Aici discutăm despre importanța și modul în care genericii funcționează în C # împreună cu diferite exemple și implementarea codului. Puteți parcurge și alte articole sugerate pentru a afla mai multe -

  1. Comparația dintre cap și cap a C # sau operator
  2. Supraîncărcare și suprasolicitare în Java
  3. Care este utilizarea supraîncărcării metodei?
  4. Cum funcționează clasa sigilată în C #?
  5. Tipuri și erori de gestionare în JavaScript
  6. Colecții PL / SQL | Sintaxa, tipuri, excepții