Introduktion till C # Generics
Så, vad är begreppet Generics i C #? I enkla ord är det begreppet att definiera typoberoende klasser, gränssnitt, metoder, delegater, egenskaper etc. Detta innebär att du kan definiera en generisk klass eller metodkropp och tillhandahålla den faktiska typen under åkallandet.
Generics är alltså som kodmallar. De låter dig skriva ett typsäkert kodblock utan att hänvisa till någon specifik datatyp. Typen för din kod bestäms vid sammanställningstiden under kallelsen för din klass eller metod.
Syntax av generiker i C #
Låt oss titta på syntaxen för en generisk deklaration i C #. Det är en mycket enkel syntax.
Som vanligt bruk betecknar bokstaven 'T' i huvudstaden och innesluten inom vinkelfästena deklarationen av en generisk kod i C #. Men detta är inte mandatet. Alla bokstäver med stora bokstäver som är inneslutna i vinkelfästena kan användas för att beteckna en generisk kod.
Förklara en generisk klass:
public class MyGenericClass
Instantiating a Generic Class:
MyGenericClass = new MyGenericClass();
Förklara en generisk härledd klass:
public class MyGenericDerivedClass : MyGenericBaseClass
Förklara en generisk metod:
public T MyGenericMethod(T item);
Hur fungerar generik i C #?
När du deklarerar en generisk kod i C # producerar kompilatorn en mall som motsvarar den koden. Denna mall kontrolleras för alla kompilationsfel förutom typsäkerhet. Nästa steg kommer när den generiska koden anropas eller kallas i en annan del av programmet. Vid tillkännagivandet anger du vilken typ som din generiska kod skulle sammanställas med. När kompilatorn når uppmaningspunkten sätter den in den typ som anges i den tidigare sammanställda mallen. Detta sammanställs sedan för att kontrollera om typsäkerhet. När koden är godkänd är den klar att köras.
Vi skulle se den sammanställda koden i exemplen nedan för att få en bättre förståelse för generiska mallar.
Exempel på generika i C #
Nedan är de olika exemplen på C # Generics:
Generiker med klass
Koda:
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:
Samma kod kan också skrivas om som nedan. Detta illustrerar kraften i att definiera en generisk klass som kan göras typsäker för flera typer i ett enda 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:
Samlad kod:
För att få ett perspektiv på hur datatypen löses i Generics, låt oss titta på den sammanställda koden som genereras när vi instanserar klassen med heltal och strängtyper i exemplet ovan.
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();
)
)
Generik med metod
Koda:
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 namnutrymme
System.Collections.Generic namnutrymme i C # innehåller gränssnitt och klasser som definierar de generiska samlingarna. De tillåter programmerarna att skapa generiska samlingar som är bättre i prestanda och lika starkt som de icke-generiska samlingarna.
Detta namnutrymme innehåller listor, ordböcker, länkade listor, hasar, nyckelvärdespar, staplar osv. Som alla är generiska till sin natur. Programmerarna kan implementera dem i sin kod.
Betydelsen av C # Generics
Nedan visas betydelsen av C # Generics enligt följande:
- Generics Tillåt kodåteranvändbarhet: den grundläggande principen för god programmering. Du behöver inte skriva samma kod för varje förväntad datatyp. Du definierar helt enkelt en typoberoende kod och berättar kompilatorn att den faktiska datatypen skulle tillhandahållas vid kodåtropningen.
- Förhindra kostnaden för boxning och un-boxing: Naturligtvis kan användningen av generiska förbipasseras genom objektklass. Nedanstående två kodkodar är likvärdiga i sina uppgifter.
Generisk kod: public T MyFunc (T-artikel);
Icke-generisk kod: offentligt objekt MyFunc (objekt)
Objektklassen ersätter alla klasser och därmed kan ovanstående icke-generiska kod också användas för att generera typoberoende kodmallar.
Men det finns ett stort prestationsgap mellan de två koderna. Att använda objektklassen medför en extra kostnad för boxning och avbokning av datatyperna. Generiker eliminerar detta och är därmed bättre i prestanda.
Slutsats
Således har vi sett hur generiska är en måste-lära sig programmeringsfunktion. Detta är ett mycket användbart koncept, inte bara i C # utan i de flesta moderna programmeringsspråk.
Vidare rekommenderas det starkt att lära sig om System.Collections.Generic namnutrymme i C #. För att förstå generikernas prestanda, djupt djupt i hur boxning och unboxing påverkar minnet såväl som körningstiden.
Rekommenderade artiklar
Detta är en guide till C # Generics. Här diskuterar vi vikten och hur generics fungerar i C # tillsammans med olika exempel och kodimplementering. Du kan också gå igenom våra andra föreslagna artiklar för att lära dig mer -
- Jämförelse mellan huvud och huvud mellan C # eller operatör
- Överbelastning och överbestyrning i Java
- Vad är användningen av metodöverbelastning?
- Hur fungerar förseglad klass i C #?
- Typer och hanteringsfel i JavaScript
- PL / SQL-samlingar | Syntax, typer, undantag