Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Generics führt das Konzept von Typparametern in .NET ein. Generics ermöglichen das Entwerfen von Klassen und Methoden, die die Spezifikation eines oder mehrerer Typparameter zurückstellen, bis Sie die Klasse oder Methode im Code verwenden. Indem Sie z. B. einen generischen Typparameter „T
“ verwenden, können Sie eine einzelne Klasse schreiben, die von anderem Clientcode verwendet werden kann, ohne dass die Kosten und Risiken von Umwandlungen zur Laufzeit oder Boxingvorgängen anfallen, wie im Folgenden gezeigt:
// Declare the generic class.
public class GenericList<T>
{
public void Add(T item) { }
}
public class ExampleClass { }
class TestGenericList
{
static void Main()
{
// Create a list of type int.
GenericList<int> list1 = new();
list1.Add(1);
// Create a list of type string.
GenericList<string> list2 = new();
list2.Add("");
// Create a list of type ExampleClass.
GenericList<ExampleClass> list3 = new();
list3.Add(new ExampleClass());
}
}
Generische Klassen und Methoden kombinieren Wiederverwendbarkeit, Typsicherheit und Effizienz auf eine Weise, die ihre nichtgenerischen Gegenstücke nicht erreichen können. Generische Typparameter werden während der Kompilierung durch die Typargumente ersetzt. Im vorherigen Beispiel ersetzt T
der Compiler durch int
. Generics werden am häufigsten für Auflistungen und deren Methoden verwendet. Der System.Collections.Generic Namespace enthält mehrere generische Auflistungsklassen. Die nichtgenerischen Auflistungen, wie z. B. ArrayList, werden nicht empfohlen und werden nur aus Kompatibilitätsgründen beibehalten. Weitere Informationen finden Sie unter Generics in .NET.
Sie können auch benutzerdefinierte generische Typen und Methoden erstellen, um Eigene generalisierte Lösungen und Entwurfsmuster bereitzustellen, die typsicher und effizient sind. Das folgende Codebeispiel zeigt eine einfache generische verknüpfte Listenklasse zu Demonstrationszwecken. (In den meisten Fällen sollten Sie die List<T> von .NET bereitgestellte Klasse verwenden, anstatt eigene zu erstellen.) Der Typparameter T
wird an mehreren Stellen verwendet, an denen ein konkreter Typ verwendet werden würde, um den Typ des in der Liste gespeicherten Elements anzugeben:
- Als Typ eines Methodenparameters in der
AddHead
Methode. - Als Rückgabetyp der Eigenschaft
Data
in der geschachtelten KlasseNode
. - Als Typ des privaten Members
data
in der geschachtelten Klasse.
T
ist für die geschachtelte Node
Klasse verfügbar. Wenn GenericList<T>
mit einem konkreten Typ instanziiert wird, z. B. als ein GenericList<int>
, wird jedes Vorkommen von T
durch int
ersetzt.
// Type parameter T in angle brackets.
public class GenericList<T>
{
// The nested class is also generic, and
// holds a data item of type T.
private class Node(T t)
{
// T as property type.
public T Data { get; set; } = t;
public Node? Next { get; set; }
}
// First item in the linked list
private Node? head;
// T as parameter type.
public void AddHead(T t)
{
Node n = new(t);
n.Next = head;
head = n;
}
// T in method return type.
public IEnumerator<T> GetEnumerator()
{
Node? current = head;
while (current is not null)
{
yield return current.Data;
current = current.Next;
}
}
}
Das folgende Codebeispiel zeigt, wie Clientcode die generische GenericList<T>
Klasse verwendet, um eine Liste mit ganzen Zahlen zu erstellen. Wenn Sie das Typargument ändern, erstellt der folgende Code Listen mit Zeichenfolgen oder einem anderen benutzerdefinierten Typ:
// A generic list of int.
GenericList<int> list = new();
// Add ten int values.
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
// Write them to the console.
foreach (int i in list)
{
Console.WriteLine(i);
}
Console.WriteLine("Done");
Hinweis
Generische Typen sind nicht auf Klassen beschränkt. In den vorangehenden Beispielen werden class
Typen verwendet; Sie können jedoch generische interface
und struct
Typen definieren, einschließlich record
Typen.
Übersicht über Generika
- Verwenden Sie generische Typen, um die Codewiederverwendung, Typsicherheit und Leistung zu maximieren.
- Die gängigste Verwendung von Generika besteht darin, Sammlungsklassen zu erstellen.
- Die .NET-Klassenbibliothek enthält mehrere generische Auflistungsklassen im System.Collections.Generic Namespace. Die generischen Auflistungen sollten nach Möglichkeit anstelle von Klassen wie ArrayList im System.Collections Namespace verwendet werden.
- Sie können eigene generische Schnittstellen, Klassen, Methoden, Ereignisse und Stellvertretungen erstellen.
- Generische Klassen können eingeschränkt werden, um den Zugriff auf Methoden für bestimmte Datentypen zu ermöglichen.
- Mithilfe der Spiegelung können Sie zur Laufzeit Informationen zu den Typen abrufen, die in einem generischen Datentyp verwendet werden.
C#-Sprachspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.