C # geneeriset tuotteet Esimerkkejä ja kuinka Generics toimii C #

Sisällysluettelo:

Anonim

Johdanto C # Generics

Joten mikä on geneeristen tuotteiden käsite C #: ssä? Yksinkertaisin sanoin, se on käsite määritellä tyypistä riippumattomat luokat, rajapinnat, menetelmät, edustajat, ominaisuudet jne. Tämä tarkoittaa, että voit määritellä yleisen luokan tai menetelmäelimen ja antaa todellisen tyypin kutsun aikana.

Siksi Generics ovat kuin koodimalleja. Niiden avulla voit kirjoittaa tyyppiturvallisen koodilohkon viittamatta mihinkään tiettyyn tietotyyppiin. Koodisi tyyppi määritetään käännöshetkellä luokan tai menetelmän kutsupyynnön aikana.

Geneeristen syntaksi C #: ssä

Katsokaamme C #: n yleisen ilmoituksen syntaksia. Se on hyvin yksinkertainen syntaksi.

Yleisenä käytäntönä on, että iso kirjain ja kulmasulkeisiin suljettu T-kirjain tarkoittaa yleisen koodin ilmoittamista C-numerossa. Mutta tämä ei ole toimeksianto. Mitä tahansa isoissa kirjaimissa, jotka on suljettu kulmasulkeisiin, voidaan käyttää yleisen koodin merkitsemistä.

Geneerisen luokan julistaminen:

public class MyGenericClass

Geneerisen luokan käynnistäminen:

MyGenericClass = new MyGenericClass();

Yleisen johdetun luokan julistaminen:

public class MyGenericDerivedClass : MyGenericBaseClass

Yleisen menetelmän julistaminen:

public T MyGenericMethod(T item);

Kuinka geneerit toimivat C #: ssä?

Kun julistat yleisen koodin C # -merkinnässä, kääntäjä tuottaa mallia, joka vastaa tätä koodia. Tätä mallia tarkistetaan kaikista käännösvirheistä paitsi tyyppiturvallisuus. Seuraava vaihe tulee esiin, kun yleinen koodi kutsutaan tai kutsutaan toiseen ohjelman osaan. Määrität kutsun yhteydessä tyypin, johon yleinen koodi kootaan. Kun kääntäjä saavuttaa kutsutuspisteen, se lisää aiemmin koottuun malliin määritetyn tyypin. Tämän jälkeen se kootaan uudelleen tyyppiturvallisuuden tarkistamiseksi. Kun koodi on annettu, koodi on valmis suoritettavaksi.

Näkisimme kootun koodin alla olevissa esimerkeissä ymmärtääksesi paremmin yleisiä malleja.

Esimerkki geneerisistä aineista C #: ssä

Alla on erilaisia ​​esimerkkejä C # Generics:

Geneeriset luokan kanssa

Koodi:

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

lähtö:

Sama koodi voidaan myös kirjoittaa uudelleen kuten alla. Tämä kuvaa voimaa määritellä geneerinen luokka, joka voidaan tehdä tyyppiturvallisiksi useille tyypeille yhdessä objektissa.

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

lähtö:

Koottu koodi:

Saadaksesi perspektiivin siitä, kuinka tietotyyppi ratkaistaan ​​Genericsissä, tarkastellaan koottua koodia, joka syntyy, kun jäljittelemme luokkaa kokonaisluku- ja merkkityypeillä yllä olevassa esimerkissä.

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

Geneeriset menetelmät

Koodi:

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

lähtö:

Järjestelmä.Kokoelmat.Yleinen nimitila

System.Collections.Generic nimitila C #: ssä sisältää rajapinnat ja luokat, jotka määrittelevät yleiset kokoelmat. Niiden avulla ohjelmoijat voivat luoda yleisiä kokoelmia, jotka ovat paremman suorituskyvyn ja yhtä vahvoja tyyppejä kuin muut kuin geneeriset kokoelmat.

Tämä nimitila sisältää luettelot, sanakirjat, linkitetyt luettelot, hashit, avain-arvo-parit, pinot jne., Jotka kaikki ovat luonteeltaan yleisiä. Ohjelmoijat voivat toteuttaa ne koodissaan.

C # geneeristen tuotteiden merkitys

Alla on C # geneeristen tuotteiden merkitys seuraavasti:

  • Geneeriset tuotteet sallivat koodin uudelleenkäytettävyyden: hyvän ohjelmoinnin perusperiaatteen. Sinun ei tarvitse kirjoittaa samaa koodia jokaiselle odotetulle tietotyypille. Sinun tarvitsee vain määrittää tyypistä riippumaton koodi ja kertoa kääntäjälle, että varsinainen tietotyyppi toimitettaisiin koodin kutsuttua.
  • Estä nyrkkeilyn ja nyrkkeilyn kustannukset: Tietenkin, geneeristen tuotteiden käyttö voidaan ohittaa kohdeluokan kautta. Kaksi alla olevaa koodipalaa vastaavat tehtäviään.

Yleinen koodi: public T MyFunc (T-tuote);

Ei-yleinen koodi: julkinen objekti MyFunc (esine-esine)

Kohdeluokka korvaa kaikki luokat ja siten yllä olevaa ei-yleistä koodia voidaan käyttää myös tyyppiriippumattomien koodimallien luomiseen.

Mutta näiden kahden koodin välillä on valtava suorituskuilu. Objektiluokan käyttäminen aiheuttaa ylimääräisiä kustannuksia tietotyyppien nyrkkeilystä ja laatikoiden poistamisesta. Geneeriset lääkkeet poistavat tämän ja ovat siten parempia suorituskykyä.

johtopäätös

Siksi olemme nähneet, kuinka geneeriset tuotteet ovat pakollisesti opittava ohjelmointiominaisuus. Tämä on erittäin hyödyllinen käsite, ei vain C # -muodossa, mutta myös uusimmissa ohjelmointikielissä.

Lisäksi on erittäin suositeltavaa oppia System.Collections.Generic nimitilasta C #: ssä. Lisäksi ymmärtääksesi geneeristen tuotteiden suorituskykyä, mietiskellä syvästi sitä, kuinka nyrkkeily ja laatikoiden poistaminen vaikuttavat muistiin ja suoritusaikaan.

Suositellut artikkelit

Tämä on opas C # Generics. Tässä keskustellaan merkityksestä ja siitä, kuinka geneeriset tuotteet toimivat C #: ssä, sekä erilaisia ​​esimerkkejä ja koodin toteutusta. Voit myös käydä läpi muiden ehdotettujen artikkeleidemme saadaksesi lisätietoja -

  1. C #: n tai operaattorin vertailu Head to Head
  2. Ylikuormitus ja ohittaminen Java-järjestelmässä
  3. Mitä menetelmän ylikuormitusta käytetään?
  4. Kuinka tiivistetty luokka toimii C #: ssä?
  5. JavaScriptin tyypit ja käsittelyvirheet
  6. PL / SQL-kokoelmat | Syntaksi, tyypit, poikkeukset