Introduktion til C # Generics
Så hvad er begrebet Generics i C #? Med enkle ord er det begrebet at definere typeuafhængige klasser, grænseflader, metoder, delegerede, egenskaber osv. Dette betyder, at du kan definere en generisk klasse eller metodekrop og angive den faktiske type under påkaldelse.
Generics er således som kodeskabeloner. De giver dig mulighed for at skrive en typesikker kodeblok uden at henvise til nogen bestemt datatype. Typen af din kode bestemmes på kompileringstidspunktet under opkaldsopkaldet til din klasse eller metode.
Syntaks for generikere i C #
Lad os se på syntaks for en generisk erklæring i C #. Det er en meget enkel syntaks.
Som en almindelig praksis betegner bogstavet 'T' i hovedstaden og lukket inden i vinkelbeslag erklæringen af en generisk kode i C #. Men dette er ikke mandatet. Ethvert bogstav i store og små bogstaver, der er lukket inden i vinkelbeslag, kan bruges til at betegne en generisk kode.
At erklære en generisk klasse:
public class MyGenericClass
Instantisering af en generisk klasse:
MyGenericClass = new MyGenericClass();
At erklære en generisk afledt klasse:
public class MyGenericDerivedClass : MyGenericBaseClass
Erklæring om en generisk metode:
public T MyGenericMethod(T item);
Hvordan fungerer generikere i C #?
Når du erklærer en generisk kode i C #, producerer kompilatoren en skabelon, der svarer til den kode. Denne skabelon kontrolleres for alle kompilationsfejl undtagen typesikkerhed. Det næste trin kommer, når den generiske kode kaldes eller kaldes op i en anden del af programmet. På tilkaldstidspunktet specificerer du den type, som din generiske kode ville blive samlet med. Når compileren når påkaldelsespunktet, indsætter den den type, der er specificeret i den tidligere kompilerede skabelon. Dette kompileres derefter igen for at kontrollere for typesikkerhed. Når koden er passeret, er koden klar til udførelse.
Vi ser den kompilerede kode i eksemplerne nedenfor for at få en bedre forståelse af generiske skabeloner.
Eksempel på generika i C #
Nedenfor er de forskellige eksempler på C # Generics:
Generik med klasse
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();
))
Produktion:
Den samme kode kan også omskrives som nedenfor. Dette illustrerer kraften i at definere en generisk klasse, der kan gø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();
)
)
Produktion:
Kompileret kode:
For at få et perspektiv på, hvordan datatypen løses i Generics, lad os se på den kompilerede kode, der er genereret, når vi instantierer klassen med heltal og strengtyper i ovenstående eksempel.
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();
)
)
Generics 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;
)
)
Produktion:
System.Collections.Generic navneområde
System.Collections.Generic navneområde i C # indeholder grænseflader og klasser, der definerer de generiske samlinger. De giver programmererne mulighed for at oprette generiske samlinger, der er bedre i ydeevne og lige så stærke som de ikke-generiske samlinger.
Dette navneområde indeholder lister, ordbøger, tilknyttede lister, Hashes, nøgleværdipar, stakler osv., Som alle har generisk karakter. Programmerne kan implementere dem i deres kode.
Betydningen af C # Generics
Nedenfor er vigtigheden af C # Generics som følger:
- Generics Tillad kodegenanvendelighed: det grundlæggende princip for god programmering. Du behøver ikke skrive den samme kode for hver forventet datatype. Du definerer simpelthen en typeuafhængig kode og fortæller kompilatoren, at den faktiske datatype vil blive leveret på tidspunktet for kodeindkaldelsen.
- Forhindre omkostningerne ved boksning og un-boksning: Naturligvis kan brugen af generiske produkter omgås gennem objektklasse. Nedenstående to kodestykker er ækvivalente i deres opgaver.
Generisk kode: offentlig T MyFunc (T-vare);
Ikke-generisk kode: offentligt objekt MyFunc (objektelement)
Objektklassen erstatter alle klasser, og ovennævnte ikke-generiske kode kan således også bruges til at generere typeuafhængige kodeskabeloner.
Men der er et enormt præstationsgap mellem de to koder. Brug af objektklassen medfører en ekstra omkostning ved boksning og afboksning af datatyperne. Generik eliminerer dette og er således bedre i ydelsen.
Konklusion
Således har vi set, hvordan generika er en must-learning programmeringsfunktion. Dette er et meget nyttigt koncept, ikke kun i C # men i de fleste moderne programmeringssprog.
Yderligere anbefales det stærkt at lære om System.Collections.Generic navneområde i C #. Også for at forstå generiske præstationer kan du dybt dykke ned i, hvordan boksning og unboxing har indflydelse på hukommelsen såvel som udførelsestiden.
Anbefalede artikler
Dette er en guide til C # Generics. Her diskuterer vi vigtigheden og hvordan Generics fungerer i C # sammen med forskellige eksempler og kodeimplementering. Du kan også gennemgå vores andre foreslåede artikler for at lære mere -
- Sammenligning af hovedet mod hovedet mellem C # eller operatør
- Overbelastning og overstyring i Java
- Hvad er brugen af metodeoverbelastning?
- Hvordan fungerer forseglet klasse i C #?
- Typer og håndteringsfejl i JavaScript
- PL / SQL samlinger | Syntaks, typer, undtagelser