Algemene klassen en methoden
Generics introduceert het concept van typeparameters voor .NET. Met generics kunt u klassen en methoden ontwerpen die de specificatie van een of meer typeparameters uitstellen totdat u de klasse of methode in uw code gebruikt. Met behulp van een algemene typeparameter T
kunt u bijvoorbeeld één klasse schrijven die andere clientcode kan gebruiken zonder de kosten of het risico van runtimecasts of boksbewerkingen te maken, zoals hier wordt weergegeven:
// Declare the generic class.
public class GenericList<T>
{
public void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int.
GenericList<int> list1 = new GenericList<int>();
list1.Add(1);
// Declare a list of type string.
GenericList<string> list2 = new GenericList<string>();
list2.Add("");
// Declare a list of type ExampleClass.
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
list3.Add(new ExampleClass());
}
}
Algemene klassen en methoden combineren herbruikbaarheid, typeveiligheid en efficiëntie op een manier die hun niet-genrische tegenhangers niet kunnen. Algemene typeparameters worden vervangen door de typeargumenten tijdens de compilatie. In het voorgaande voorbeeld vervangt T
de compiler door int
. Generics worden het vaakst gebruikt met verzamelingen en de methoden die hierop werken. De System.Collections.Generic naamruimte bevat verschillende algemene verzamelingsklassen. De niet-genrische verzamelingen, zoals ArrayList niet aanbevolen en worden alleen onderhouden voor compatibiliteitsdoeleinden. Zie Generics in .NET voor meer informatie.
U kunt ook aangepaste algemene typen en methoden maken om uw eigen gegeneraliseerde oplossingen en ontwerppatronen te bieden die typeveilig en efficiënt zijn. In het volgende codevoorbeeld ziet u een eenvoudige algemene klasse voor gekoppelde lijsten voor demonstratiedoeleinden. (In de meeste gevallen moet u de List<T> klasse van .NET gebruiken in plaats van uw eigen klasse te maken.) De typeparameter T
wordt gebruikt op verschillende locaties waar normaal gesproken een concreet type wordt gebruikt om het type item aan te geven dat in de lijst is opgeslagen:
- Als het type methodeparameter in de
AddHead
methode. - Als retourtype van de
Data
eigenschap in de genesteNode
klasse. - Als het type privélid
data
in de geneste klasse.
T
is beschikbaar voor de geneste Node
klasse. Wanneer GenericList<T>
wordt geïnstantieerd met een concreet type, bijvoorbeeld als een GenericList<int>
, wordt elk exemplaar T
vervangen door int
.
// type parameter T in angle brackets
public class GenericList<T>
{
// The nested class is also generic on T.
private class Node
{
// T used in non-generic constructor.
public Node(T t)
{
next = null;
data = t;
}
private Node? next;
public Node? Next
{
get { return next; }
set { next = value; }
}
// T as private member data type.
private T data;
// T as return type of property.
public T Data
{
get { return data; }
set { data = value; }
}
}
private Node? head;
// constructor
public GenericList()
{
head = null;
}
// T as method parameter type:
public void AddHead(T t)
{
Node n = new Node(t);
n.Next = head;
head = n;
}
public IEnumerator<T> GetEnumerator()
{
Node? current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}
In het volgende codevoorbeeld ziet u hoe clientcode gebruikmaakt van de algemene GenericList<T>
klasse om een lijst met gehele getallen te maken. Als u het typeargument wijzigt, maakt de volgende code lijsten met tekenreeksen of een ander aangepast type:
class TestGenericList
{
static void Main()
{
// int is the type argument
GenericList<int> list = new GenericList<int>();
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
foreach (int i in list)
{
System.Console.Write(i + " ");
}
System.Console.WriteLine("\nDone");
}
}
Notitie
Algemene typen zijn niet beperkt tot klassen. In de voorgaande voorbeelden worden typen gebruikt class
, maar u kunt algemene interface
typen en struct
typen definiëren, inclusief record
typen.
Overzicht van generics
- Gebruik algemene typen om het hergebruik van code, typeveiligheid en prestaties te maximaliseren.
- Het meest voorkomende gebruik van generics is het maken van verzamelingsklassen.
- De .NET-klassebibliotheek bevat verschillende algemene verzamelingsklassen in de System.Collections.Generic naamruimte. De algemene verzamelingen moeten waar mogelijk worden gebruikt in plaats van klassen zoals ArrayList in de System.Collections naamruimte.
- U kunt uw eigen algemene interfaces, klassen, methoden, gebeurtenissen en gemachtigden maken.
- Algemene klassen kunnen worden beperkt om toegang tot methoden voor bepaalde gegevenstypen in te schakelen.
- U kunt tijdens runtime informatie verkrijgen over de typen die worden gebruikt in een algemeen gegevenstype door reflectie te gebruiken.
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie.