Uvod v C # generike

Kakšen je torej pojem Generics v C #? Z enostavnimi besedami gre za koncept definiranja neodvisno od vrste razredov, vmesnikov, metod, delegatov, lastnosti itd. To pomeni, da lahko med priklicem določite generični razred ali telo metode.

Tako so Generiki podobni predlogi kod. Omogočajo vam, da napišete varno vrsto bloka kod, ne da bi se sklicevali na noben poseben tip podatkov. Vrsta vaše kode je določena ob času priprave med klicem za vaš razred ali metodo.

Sintaksa generike v C #

Poglejmo si skladnjo generične deklaracije v C #. Gre za zelo preprosto skladnjo.

Kot običajna praksa črka „T“, napisana v velikem tisku in zaprta v kotnih oklepajih, označuje oznako splošne kode v C #. Ampak, to ni mandat. Vsaka črka z velikimi črkami, priložena v kotnih oklepajih, se lahko uporablja za označevanje generične kode.

Razglasitev generičnega razreda:

public class MyGenericClass

Instanting generic Class:

MyGenericClass = new MyGenericClass();

Razglasitev generičnega izpeljanega razreda:

public class MyGenericDerivedClass : MyGenericBaseClass

Izjava splošne metode:

public T MyGenericMethod(T item);

Kako generiki delujejo v C #?

Ko deklarirate generično kodo v C #, prevajalnik ustvari predlogo, ki je enaka tej kodi. Ta predloga je preverjena za vse napake pri sestavljanju, razen varnosti tipa. Naslednji korak je, ko se generična koda prikliče ali pokliče v drugem delu programa. Ob priklicu določite vrsto, s katero bi sestavila vaša splošna koda. Ko prevajalnik doseže točko klica, vstavi vrsto, določeno v prej sestavljeni predlogi. To se nato znova sestavi za preverjanje varnosti tipa. Ko je koda pripravljena za izvedbo.

V spodnjih primerih bomo videli sestavljeno kodo za boljše razumevanje splošnih predlog.

Primer generike v C #

Spodaj so različni primeri C # generikov:

Generiki z razredom

Koda:

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

Izhod:

Lahko se napiše tudi ista koda kot spodaj. To ponazarja moč definiranja generičnega razreda, ki ga je mogoče narediti varnega za več vrst v enem predmetu.

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

Izhod:

Sestavljena koda:

Če si želimo ogledati, kako je podatkovni tip razrešen v Generiki, si oglejmo sestavljeno kodo, ki je bila generirana, ko razredu primerjamo celoten in niz niz v zgornjem primeru.

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

Generiki z metodo

Koda:

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

Izhod:

System.Collections.Generic namespace

System.Collections.Generic namespace v C # vsebuje vmesnike in razrede, ki definirajo generične zbirke. Programerjem omogočajo, da ustvarijo generične zbirke, ki so učinkovitejše in enako močne kot tipi, ki niso generične.

V tem imenem prostoru so seznami, slovarji, povezani seznami, različice, ključi in vrednost, pari itd., Ki so splošne narave. Programerji jih lahko implementirajo v kodo.

Pomen Generic C #

Spodaj je pomemben pomen generike C #:

  • Generiki omogočajo ponovno uporabo kode: temeljno načelo dobrega programiranja. Za vsako pričakovano vrsto podatkov vam ni treba napisati iste kode. Enostavno določite kodo, ki ni odvisna od tipa in povejte prevajalcu, da bi bil v času priklica kode zagotovljen dejanski tip podatkov.
  • Preprečite stroške boksa in neboksanja: Seveda lahko uporabo generikov zaobidete skozi objektni razred. Spodnja dva dela kode sta enakovredna v svojih nalogah.

Splošna koda: javna T MyFunc (postavka T);

Ne generična koda: javni objekt MyFunc (predmet predmet)

Predmetni razred nadomešča vse razrede in tako lahko zgornjo ne generično kodo uporabite tudi za ustvarjanje predloga, neodvisno od vrste.

Toda med obema kodama je velik razkorak med zmogljivostmi. Z uporabo predmetnega razreda nastanejo dodatni stroški boksa in razpakiranja podatkovnih vrst. Generiki to odpravljajo in so tako boljši v delovanju.

Zaključek

Tako smo videli, kako je generika funkcija učenja, ki se jo je treba naučiti. To je zelo uporaben koncept, ne samo v jeziku C #, ampak tudi v večini sodobnih programskih jezikov.

Nadalje je zelo priporočljivo, da se seznanite s sistemskim imenikom System.Collections.Generic v C #. Da bi razumeli uspešnost generičnih izdelkov, se globoko potopite v to, kako boks in unboxing vplivata na pomnilnik in čas izvedbe.

Priporočeni članki

To je vodnik za C # Generics. Tukaj razpravljamo o pomembnosti in delovanju generike v C #, skupaj z različnimi primeri in implementacijo kode. Če želite izvedeti več, lahko preberete tudi druge naše predlagane članke -

  1. Primerjava med nami in operaterjem C #
  2. Preobremenitev in preglasitev na Javi
  3. Kakšna je uporaba preobremenitve metode?
  4. Kako zapečateni razred deluje v C #?
  5. Vrste in napake pri rokovanju v JavaScript
  6. Zbirke PL / SQL | Sintaksa, vrste, izjeme