C # Generics - Eksempler og hvordan generikker fungerer i C #

Innholdsfortegnelse:

Anonim

Introduksjon til C # Generics

Så, hva er konseptet Generics i C #? Med enkle ord er det konseptet å definere typeuavhengige klasser, grensesnitt, metoder, delegater, egenskaper osv. Dette betyr at du kan definere en generisk klasse eller metodekropp og gi den faktiske typen under påkallelse.

Dermed er Generics som kodemaler. De lar deg skrive en typesikker kodeblokk uten å referere til noen bestemt datatype. Typen på koden din bestemmes ved samlingen under påkallingen for klassen eller metoden din.

Syntax of Generics in C #

La oss se på syntaksen til en generisk erklæring i C #. Det er en veldig enkel syntaks.

Som en vanlig praksis betegner bokstaven 'T' i hovedstaden og innelukket i kantete parentes erklæringen om en generisk kode i C #. Men dette er ikke mandatet. Enhver bokstav i store bokstaver som er lukket i kantete parenteser, kan brukes til å betegne en generisk kode.

Å erklære en generisk klasse:

public class MyGenericClass

Instantiating a Generic Class:

MyGenericClass = new MyGenericClass();

Å erklære en generisk avledet klasse:

public class MyGenericDerivedClass : MyGenericBaseClass

Å erklære en generisk metode:

public T MyGenericMethod(T item);

Hvordan fungerer Generics i C #?

Når du deklarerer en generisk kode i C #, produserer kompilatoren en mal som tilsvarer den koden. Denne malen er sjekket for alle kompilasjonsfeil unntatt typesikkerhet. Neste trinn kommer når den generiske koden blir påkalt eller kalt inn en annen del av programmet. På innkallingstidspunktet spesifiserer du typen som den generiske koden din vil bli satt sammen med. Når kompilatoren når påkallingspunktet, setter den inn typen som er spesifisert i den tidligere kompilerte malen. Dette blir deretter kompilert på nytt for å se etter typesikkerhet. Når koden er passert, er koden klar til utførelse.

Vi vil se den kompilerte koden i eksemplene nedenfor for å få en bedre forståelse av generiske maler.

Eksempel på generikk i C #

Nedenfor er de forskjellige eksemplene på C # Generics:

Generics with Class

Kode:

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

Produksjon:

Den samme koden kan også skrives på nytt som nedenfor. Dette illustrerer kraften til å definere en generisk klasse som kan gjøres typesikker for flere typer i et enkelt objekt.

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

Produksjon:

Utarbeidet kode:

For å få et perspektiv på hvordan datatypen løses i Generics, la oss se på den kompilerte koden som er generert når vi instantierer klassen med heltall- og strengtyper i eksemplet ovenfor.

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

Generikere med metode

Kode:

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

Produksjon:

The System.Collections.Generic namespace

System.Collections.Generic navnefelt i C # inneholder grensesnitt og klasser som definerer generiske samlinger. De lar programmererne lage generiske samlinger som er bedre i ytelse og like sterkt typer som de ikke-generiske samlingene.

Dette navneområdet inneholder lister, ordbøker, koblede lister, hasjer, nøkkelverdipar, stabler osv., Som alle har generisk karakter. Programmørene kan implementere dem i koden sin.

Betydningen av C # Generics

Nedenfor er viktigheten av C # Generics som følger:

  • Generics Tillat kode gjenbruk: det grunnleggende prinsippet om god programmering. Du trenger ikke skrive den samme koden for hver forventet datatype. Du definerer ganske enkelt en typeuavhengig kode og forteller kompilatoren at den faktiske datatypen vil bli gitt på tidspunktet for innkalling av kode.
  • Forhindre kostnadene ved boksing og un-boksing: Selvfølgelig kan bruken av generiske omgås gjennom objektklasse. De to kodestykkene nedenfor er likeverdige i oppgavene sine.

Generisk kode: offentlig T MyFunc (T-vare);

Ikke-generisk kode: offentlig objekt MyFunc (objektelement)

Objektklassen erstatter alle klasser, og dermed kan den ovenfor ikke-generiske koden også brukes til å generere typuavhengige kodemaler.

Men det er et stort ytelsesgap mellom de to kodene. Bruk av objektklassen medfører en ekstra kostnad for boksing og avboksing av datatypene. Generiske eliminerer dette og er dermed bedre i ytelse.

Konklusjon

Dermed har vi sett hvordan generiske er en må-lære programmeringsfunksjon. Dette er et svært nyttig konsept, ikke bare i C # men i de fleste moderne programmeringsspråk.

Videre anbefales det sterkt å lære om System.Collections.Generic navnefelt i C #. For å forstå generikkenes ytelse, kan du dykke dypt inn i hvordan boksing og unboxing har innvirkning på minne så vel som utførelsestid.

Anbefalte artikler

Dette er en guide til C # Generics. Her diskuterer vi viktigheten og hvordan generikker fungerer i C # sammen med forskjellige eksempler og kodeimplementering. Du kan også gå gjennom andre foreslåtte artikler for å lære mer -

  1. Head to Head Sammenligning av C # eller operatør
  2. Overbelastning og overstyring i Java
  3. Hva er bruken av metodeoverbelastning?
  4. Hvordan fungerer forseglet klasse i C #?
  5. Typer og håndteringsfeil i JavaScript
  6. PL / SQL-samlinger | Syntaks, typer, unntak