C # Generics - Voorbeelden en hoe generieken werken in C #

Inhoudsopgave:

Anonim

Inleiding tot C # Generics

Dus, wat is het concept van generieken in C #? In eenvoudige woorden, het is het concept van het definiëren van type-onafhankelijke klassen, interfaces, methoden, gedelegeerden, eigenschappen, enz. Dit betekent dat u een generieke klasse of methode-instantie kunt definiëren en het werkelijke type kunt opgeven tijdens een aanroep.

Generics lijken dus op codesjablonen. Hiermee kunt u een typebestendig codeblok schrijven zonder naar een bepaald gegevenstype te verwijzen. Het type van uw code wordt tijdens het compileren bepaald tijdens de aanroep van uw klas of methode.

Syntaxis van generieke geneesmiddelen in C #

Laten we eens kijken naar de syntaxis van een generieke verklaring in C #. Het is een heel eenvoudige syntaxis.

Het is gebruikelijk dat de letter 'T' in de hoofdletter en tussen vierkante haakjes staat voor de verklaring van een generieke code in C #. Maar dit is niet het mandaat. Elke hoofdletter tussen vierkante haakjes kan worden gebruikt om een ​​generieke code aan te duiden.

Een generieke klasse verklaren:

public class MyGenericClass

Een generieke klasse instantiëren:

MyGenericClass = new MyGenericClass();

Een generieke afgeleide klasse verklaren:

public class MyGenericDerivedClass : MyGenericBaseClass

Een generieke methode verklaren:

public T MyGenericMethod(T item);

Hoe generieken werken in C #?

Wanneer u een generieke code in C # declareert, produceert de compiler een sjabloon dat equivalent is aan die code. Deze sjabloon wordt gecontroleerd op alle compilatiefouten behalve typeveiligheid. De volgende stap komt wanneer de generieke code wordt aangeroepen of in een ander deel van het programma wordt aangeroepen. Op het moment van aanroep geeft u het type op waarmee uw generieke code zou worden gecompileerd. Wanneer de compiler het aanroeppunt bereikt, voegt hij het type in dat is opgegeven in de eerder gecompileerde sjabloon. Dit wordt vervolgens opnieuw samengesteld om te controleren op typeveiligheid. Eenmaal aangenomen, is de code klaar voor uitvoering.

We zouden de gecompileerde code in de onderstaande voorbeelden zien voor een beter begrip van generieke sjablonen.

Voorbeeld van generieken in C #

Hieronder staan ​​de verschillende voorbeelden van C # Generics:

Generiek met Klasse

Code:

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

Output:

Dezelfde code kan ook opnieuw worden geschreven zoals hieronder. Dit illustreert de kracht van het definiëren van een generieke klasse die typeveilig kan worden gemaakt voor meerdere typen in een enkel object.

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

Output:

Gecompileerde Code:

Om een ​​beeld te krijgen van hoe het gegevenstype wordt opgelost in Generics, laten we kijken naar de gecompileerde code die wordt gegenereerd wanneer we de klasse instantiëren met integer- en stringtypen in het bovenstaande voorbeeld.

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

Generiek met methode

Code:

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

Output:

De System.Collections.Generic-naamruimte

De System.Collections.Generic-naamruimte in C # bevat interfaces en klassen die de generieke collecties definiëren. Hiermee kunnen programmeurs generieke collecties maken die beter presteren en even sterk zijn als de niet-generieke collecties.

Deze naamruimte bevat Lijsten, Woordenboeken, Gekoppelde Lijsten, Hashes, Key-Value Pairs, Stacks, etc. die allemaal generiek van aard zijn. De programmeurs kunnen ze in hun code implementeren.

Het belang van C # Generics

Hieronder is het belang van C # Generics als volgt:

  • Generics staan ​​code-herbruikbaarheid toe: het fundamentele principe van goed programmeren. U hoeft niet voor elk verwacht gegevenstype dezelfde code te schrijven. U definieert eenvoudig een type-onafhankelijke code en vertelt de compiler dat het daadwerkelijke gegevenstype zou worden verstrekt op het moment van het aanroepen van de code.
  • Voorkom de kosten van boksen en Un-Boxing: Natuurlijk kan het gebruik van generieke geneesmiddelen worden omzeild door middel van objectklasse. De onderstaande twee stukjes code zijn equivalent in hun taken.

Algemene code: openbaar T MyFunc (T-item);

Niet-generieke code: openbaar object MyFunc (objectitem)

De objectklasse vervangt alle klassen en dus kan de bovenstaande niet-generieke code ook worden gebruikt om type-onafhankelijke codesjablonen te genereren.

Maar er is een enorme prestatiekloof tussen de twee codes. Het gebruik van de objectklasse brengt extra kosten met zich mee voor het in- en uitpakken van de gegevenstypen. Generics elimineren dit en zijn dus beter in prestaties.

Conclusie

We hebben dus gezien hoe generiek een programmeerfunctie moet zijn die u moet leren. Dit is een zeer nuttig concept, niet alleen in C #, maar in de meeste moderne programmeertalen.

Verder wordt het ten zeerste aanbevolen om meer te weten te komen over de System.Collections.Generic-naamruimte in C #. Om ook de prestaties van generieke geneesmiddelen te begrijpen, gaat u diep in op hoe boksen en unboxen een impact hebben op het geheugen en op de uitvoeringstijd.

Aanbevolen artikelen

Dit is een gids voor C # Generics. Hier bespreken we het belang en hoe generieken werken in C # samen met verschillende voorbeelden en code-implementatie. U kunt ook onze andere voorgestelde artikelen doornemen voor meer informatie -

  1. Head to Head-vergelijking van C # of operator
  2. Overbelasting en opheffen in Java
  3. Wat is het nut van methode-overbelasting?
  4. Hoe werkt Sealed Class in C #?
  5. Typen en verwerkingsfouten in JavaScript
  6. PL / SQL-collecties | Syntaxis, typen, uitzonderingen