Uvod u C # generike
Dakle, kakav je koncept Generike u C #? Jednostavnim riječima, to je koncept definiranja klasa, sučelja, metoda, delegata, svojstava, neovisnih o tipu, itd. To znači da možete definirati generičku klasu ili tijelo metode i pružiti stvarni tip tijekom poziva.
Dakle, Generičari su poput predloška kodova. Omogućuju vam pisanje bloka kodova sigurnog za upotrebu bez pozivanja na bilo koju određenu vrstu podataka. Vrsta vašeg koda određuje se u vrijeme sastavljanja tijekom poziva za vašu klasu ili metodu.
Sintaksa generičkih slova u C #
Pogledajmo sintaksu generičke deklaracije u C #. To je vrlo jednostavna sintaksa.
Kao uobičajenu praksu, slovo 'T' s velikim slovom i zatvorenim u kutnim zagradama označava deklaraciju generičkog koda u C #. Ali, ovo nije mandat. Svako veliko slovo napisano u kutnim zagradama može se koristiti za označavanje Generičkog koda.
Izjava generičke klase:
public class MyGenericClass
Instantiranje generičke klase:
MyGenericClass = new MyGenericClass();
Izjava generičke izvedene klase:
public class MyGenericDerivedClass : MyGenericBaseClass
Izjava generičke metode:
public T MyGenericMethod(T item);
Kako generičari rade u C #?
Kad deklarirate generički kôd u C #, prevodilac proizvodi predložak jednak tom kôdu. Ovaj se predložak provjerava na sve pogreške kod sastavljanja, osim sigurnosti vrste. Sljedeći korak dolazi kada se generički kôd poziva ili poziva u drugom dijelu programa. U trenutku poziva, odredite vrstu s kojom bi se sastavio vaš generički kôd. Kad prevodilac dosegne točku poziva, umetne vrstu navedenu u prethodno sastavljeni predložak. To se zatim ponovno sastavlja radi provjere sigurnosti tipa. Nakon što prođe, kod je spreman za izvršenje.
Vidjeli bismo sastavljeni kod u donjim primjerima da bismo bolje razumjeli generičke predloške.
Primjer generičkih zapisa u C #
Ispod su sljedeći primjeri C # Genericsa:
Generičari s klasom
Kodirati:
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();
))
Izlaz:
Isti se kod također može prepisati kao dolje. Ovo ilustrira snagu definiranja generičke klase koja se može učiniti sigurnim za više tipova u jednom objektu.
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();
)
)
Izlaz:
Sastavljen kod:
Da biste dobili uvid u to kako se tip podataka rješava u Genericima, pogledajmo sastavljeni kôd koji se generira kada instanciramo klasu s cijelim i nizovima u gornjem primjeru.
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();
)
)
Generike s metodom
Kodirati:
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;
)
)
Izlaz:
System.Collections.Generic namespace
System.Collections.Generic namespace u C # sadrži sučelja i klase koje definiraju generičke kolekcije. Omogućuju programerima da stvore generičke kolekcije koje su boljih performansi i jednako tipične kao ne generičke kolekcije.
Ovaj prostor s imenima sadrži Popise, Rječnike, Povezane popise, Hasheve, parove ključa i vrijednosti, snopove itd., Koji su sve naravi. Programeri ih mogu implementirati u svoj kod.
Važnost C # generike
Ispod je važnost generacije C # kako slijedi:
- Generike dopuštaju ponovnu upotrebu koda: temeljno načelo dobrog programiranja. Ne morate pisati isti kôd za svaku očekivanu vrstu podataka. Jednostavno definirate kôd neovisan o tipu i kažete prevoditelju da će se stvarna vrsta podataka pružiti u vrijeme poziva koda.
- Spriječite troškove boksa i ne-boksa: Naravno da se upotreba generika može zaobići objektnom klasom. Donja dva dijela koda jednaka su svojim zadacima.
Opći kod: javni T MyFunc (T stavka);
Non-Generic Code: javni objekt MyFunc (stavka objekta)
Objektna klasa zamjenjuje sve klase i stoga se gore navedeni ne generički kôd također može koristiti za generiranje predloženih neovisnih predložaka koda.
Ali, postoji ogroman jaz u performansama između dva koda. Upotreba klase objekata uzrokuje dodatne troškove boksa i raspakiranja tipova podataka. Generičari to uklanjaju i time su bolji u izvedbi.
Zaključak
Dakle, vidjeli smo kako generike moraju biti značajka programiranja. Ovo je vrlo koristan koncept, ne samo u jeziku C #, već iu većini modernih programskih jezika.
Nadalje, toplo se preporučuje da saznate više o prostoru System.Collections.Generic u C #. Također, da biste razumjeli performanse generika, duboko se zavirite u to kako boks i unboxing utječu na memoriju kao i vrijeme izvršenja.
Preporučeni članci
Ovo je vodič za C # Genericse. Ovdje smo raspravljali o važnosti i načinu rada generike na C #, zajedno s različitim primjerima i implementacijom koda. Možete i proći naše druge predložene članke da biste saznali više -
- Usporedba C # ili operatera
- Preopterećenje i preglasavanje u Javi
- U čemu se koristi preopterećenje metoda?
- Kako djeluje zatvorena klasa u C #?
- Vrste i rukovanje pogreškama u JavaScript-u
- Zbirke PL / SQL | Sintaksa, vrste, iznimke