C # Generics sissejuhatus
Mis on geneeriliste ravimite kontseptsioon C #-s? Lihtsamalt öeldes tähendab see tüübist sõltumatute klasside, liideste, meetodite, delegaatide, omaduste jne määratlemist. See tähendab, et saate määratleda üldise klassi või meetodikorpuse ja kutsuda esile tegeliku tüübi.
Seega on geneerikud nagu koodimallid. Need võimaldavad teil kirjutada tüübikindla koodiploki ilma konkreetsele andmetüübile viitamata. Teie koodi tüüp määratakse teie klassi või meetodi jaoks väljakutsekutse ajal kompileerimise ajal.
Geneerikute süntaks C # -s
Vaatame C # -s esitatud ülddeklaratsiooni süntaksi. See on väga lihtne süntaks.
Üldine tava tähendab, et suurtähega ja nurksulgudesse suletud tähega T tähistatakse C-koodiga üldkoodi deklareerimist. Kuid see pole volitus. Üldnumbri tähistamiseks võib kasutada nurksulgudesse suletud suurtähte.
Üldklassi kuulutamine:
public class MyGenericClass
Üldklassi käivitamine:
MyGenericClass = new MyGenericClass();
Üldise tuletatud klassi kuulutamine:
public class MyGenericDerivedClass : MyGenericBaseClass
Üldise meetodi deklareerimine:
public T MyGenericMethod(T item);
Kuidas geneerikud töötavad C # -s?
Kui kuulutate C-koodis üldkoodi, koostab kompilaator selle koodiga samaväärse malli. Seda malli kontrollitakse kõigi kompileerimisvigade suhtes, välja arvatud tüübi ohutus. Järgmine samm tuleb siis, kui üldkoodi kutsutakse või sellele helistatakse programmi muus osas. Kutsumise ajal täpsustate tüübi, millele teie üldkood koostatakse. Kui kompilaator jõuab kutsumispunkti, lisab see tüübi, mis oli täpsustatud varem kompileeritud mallil. Seejärel koostatakse see uuesti tüübi ohutuse kontrollimiseks. Pärast möödumist on kood täitmiseks valmis.
Koostatud koodi näeksime allpool toodud näidetes, et saada paremini aru üldistest mallidest.
C geneeriliste ravimite näide
Allpool on toodud erinevad näited C # geneerikast:
Generikud klassiga
Kood:
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äljund:
Sama koodi saab ümber kirjutada ka allpool. See illustreerib üldklassi määratlemise võimet, mille saab muuta ühes objektis mitut tüüpi tüübi jaoks ohutuks.
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äljund:
Koostatud kood:
Vaadamaks Genericsis andmetüübi lahendamise vaatenurka, vaatame koostatud koodi, mis genereeritakse, kui klassifitseerime klassi ülaltoodud näites täisarvude ja stringitüüpidega.
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();
)
)
Geneerikad koos meetodiga
Kood:
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äljund:
Süsteem System.Collections.Üldine nimeruum
C # süsteemis System.Collections.Generaline nimeruum sisaldab liideseid ja klasse, mis määratlevad üldkogumid. Need võimaldavad programmeerijatel luua geneerilisi kogusid, mis on parema jõudlusega ja sama tugevad kui mittegeneerilised kollektsioonid.
See nimeruum sisaldab loendeid, sõnaraamatuid, lingitud loendeid, räsi, võtmeväärtuse paari, pinu jne, mis kõik on üldist laadi. Programmeerijad saavad neid oma koodis rakendada.
C # geneerikute tähtsus
Allpool on C # geneeriliste toodete tähtsus järgmine:
- Geneerikud võimaldavad koodide taaskasutatavust: hea programmeerimise aluspõhimõte. Te ei pea kirjutama sama koodi iga eeldatava andmetüübi jaoks. Sa lihtsalt määratled tüübist sõltumatu koodi ja ütled kompilaatorile, et tegelik andmetüüp antakse koodi kutsumisel.
- Takistage boksi ja boksiga mitteseotud kulude maksmist: geneeriliste ravimite kasutamisest võib muidugi objektiklassi kaudu mööda minna. Kaks allpool olevat kooditükki on nende ülesannetes samaväärsed.
Üldine kood: public T MyFunc (T element);
Üldine kood: avalik objekt MyFunc (objekti üksus)
Objektiklass asendab kõiki klasse ja seega saab ülaltoodud mitte-geneerilist koodi kasutada ka tüübist sõltumatute koodimallide genereerimiseks.
Kuid kahe koodi vahel on tohutu jõudluslõhe. Objektiklassi kasutamine lisandub andmetüüpide boksi ja kasti eemaldamise lisakulusid. Geneerikud välistavad selle ja on seetõttu parema jõudlusega.
Järeldus
Seega oleme näinud, kuidas geneerilised ravimid on programmeerimisvõimalused, mida tuleb õppida. See on väga kasulik kontseptsioon, mitte ainult C # puhul, vaid ka enamikes kaasaegsetes programmeerimiskeeltes.
Lisaks on tungivalt soovitatav õppida tundma süsteemi System.Collections.Generiline nimeruum C # -s. Samuti mõelge geneerikute toimivuse mõistmiseks sügavalt, kuidas poksimine ja karbist eemaldamine mõjutavad nii mälu kui ka täitmise aega.
Soovitatavad artiklid
See on juhend C # Generics. Siin käsitleme olulisust ja seda, kuidas geneerikud C #-s töötavad, koos erinevate näidete ja koodide rakendamisega. Lisateavet leiate ka meie muudest soovitatud artiklitest -
- C # või operaatori võrdlus peaga
- Java ülekoormamine ja alistamine
- Mis kasu on meetodi ülekoormamisest?
- Kuidas suletud klass C-klassis töötab?
- Tüübid ja vigade käsitlemine JavaScriptis
- PL / SQL kogud | Süntaks, tüübid, erandid