C # Generiká Príklady a ako generiká fungujú v jazyku C #

Obsah:

Anonim

Úvod do C # Generics

Aký je teda pojem Generics v jazyku C #? Jednoducho povedané, ide o definíciu tried, rozhraní, metód, delegátov, vlastností atď., Ktoré sú nezávislé od typu. To znamená, že môžete definovať všeobecnú triedu alebo telo metódy a poskytnúť skutočný typ počas vyvolania.

Generics sú teda ako šablóny kódov. Umožňujú vám napísať blok kódu bezpečný pre daný typ bez odkazu na konkrétny typ údajov. Typ kódu sa určuje v čase kompilácie počas vyvolávacieho hovoru pre vašu triedu alebo metódu.

Syntax generík v jazyku C #

Pozrime sa na syntax generického vyhlásenia v C #. Je to veľmi jednoduchá syntax.

Ako bežná prax, písmeno „T“ v hlavnom meste a uzavreté v hranatých zátvorkách označuje vyhlásenie generického kódu v C #. Toto však nie je mandát. Na označenie všeobecného kódu možno použiť každé veľké písmeno, ktoré je uvedené v hranatých zátvorkách.

Vyhlásenie generickej triedy:

public class MyGenericClass

Okamžitá generická trieda:

MyGenericClass = new MyGenericClass();

Vyhlásenie všeobecnej odvodenej triedy:

public class MyGenericDerivedClass : MyGenericBaseClass

Vyhlásenie všeobecnej metódy:

public T MyGenericMethod(T item);

Ako generiká pracujú v C #?

Keď deklarujete všeobecný kód v jazyku C #, kompilátor vytvorí šablónu ekvivalentnú tomuto kódu. V tejto šablóne sa kontrolujú všetky chyby kompilácie okrem typovej bezpečnosti. Ďalší krok prichádza, keď sa generický kód vyvolá alebo zavolá v inej časti programu. V čase vyvolania určíte typ, s ktorým sa bude generický kód kompilovať. Keď kompilátor dosiahne bod vyvolania, vloží typ špecifikovaný v predtým skompilovanej šablóne. Toto sa potom znova zostaví, aby sa skontrolovala bezpečnosť typu. Po odovzdaní je kód pripravený na vykonanie.

V nasledujúcich príkladoch by sme videli kompilovaný kód, aby sme lepšie porozumeli všeobecným šablónam.

Príklad generík v jazyku C #

Nižšie sú uvedené rôzne príklady C # Generics:

Generiká s triedou

kód:

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

Výkon:

Rovnaký kód je možné prepísať aj nižšie. Toto ilustruje silu definovania generickej triedy, ktorá môže byť typovo bezpečná pre viacero typov v jednom objekte.

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

Výkon:

Zostavený kód:

Ak chcete získať predstavu o tom, ako je typ údajov vyriešený v časti Generics, pozrime sa na kompilovaný kód vygenerovaný, keď vytvoríme inštanciu triedy pomocou vyššie uvedených typov integer a string.

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

Generiká s metódou

kód:

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

Výkon:

The System.Collections.Generic namespace

System.Collections.Generic namespace v C # obsahuje rozhrania a triedy, ktoré definujú všeobecné zbierky. Umožňujú programátorom vytvárať všeobecné zbierky, ktoré majú lepšiu výkonnosť a sú rovnako silné ako neštandardné zbierky.

Tento menný priestor obsahuje zoznamy, slovníky, prepojené zoznamy, hash, páry kľúč - hodnota, stohy atď., Ktoré sú všetky povahy. Programátori ich môžu implementovať do svojho kódu.

Dôležitosť C # generík

Nižšie je uvedený význam C # generík:

  • Generiká umožňujú opakovanú použiteľnosť kódu: základný princíp dobrého programovania. Nemusíte písať rovnaký kód pre každý očakávaný typ údajov. Jednoducho zadefinujete kód nezávislý od typu a oznámite kompilátorovi, že skutočný typ údajov bude poskytnutý v čase vyvolania kódu.
  • Zabráňte nákladom na box a odblokovanie: Použitie generík je samozrejme možné obísť pomocou triedy objektov. Nižšie uvedené dve časti kódu sú rovnocenné vo svojich úlohách.

Všeobecný kód: verejné T MyFunc (položka T);

Non-Generic Code: public object MyFunc (položka objektu)

Trieda objektov nahrádza všetky triedy, a teda vyššie uvedený ne-generický kód sa môže tiež použiť na generovanie šablón kódov nezávislých od typu.

Medzi týmito dvoma kódmi je však veľká medzera vo výkone. Používanie triedy objektov spôsobuje dodatočné náklady na boxovanie a rozbaľovanie typov údajov. Generiká to vylučujú a majú tak lepšiu výkonnosť.

záver

Preto sme videli, ako sú generiká povinnosťou programovania. Toto je veľmi užitočný koncept, a to nielen v jazyku C #, ale aj vo väčšine moderných programovacích jazykov.

Ďalej sa dôrazne odporúča naučiť sa viac o System.Collections.Generic namespace v C #. Aby sme pochopili výkon generík, dôkladne sa pustite do toho, aký vplyv má box a unboxing na pamäť a čas vykonávania.

Odporúčané články

Toto je sprievodca C # Generics. Tu diskutujeme dôležitosť a spôsob práce generikov v jazyku C # spolu s rôznymi príkladmi a implementáciou kódu. Viac informácií nájdete aj v ďalších navrhovaných článkoch -

  1. Porovnanie C # alebo Operátora s porovnaním medzi dvoma hlavami
  2. Preťaženie a prekonanie v Jave
  3. Čo je použitie preťaženia metódami?
  4. Ako funguje trieda Sealed v jazyku C #?
  5. Typy a manipulácia s chybami v JavaScripte
  6. Zbierky PL / SQL Syntax, typy, výnimky