Übersicht über Generika in .NET Framework
Aktualisiert: November 2007
In diesem Thema finden Sie eine Übersicht über Generika in .NET Framework sowie eine Zusammenfassung generischer Typen oder Methoden. Außerdem wird die Terminologie zur Erörterung der Generika festgelegt.
Definieren und Verwenden von Generika
Generika sind Klassen, Strukturen, Schnittstellen und Methoden, die Platzhalter (Typparameter) für einen oder mehrere Typen besitzen, die in ihnen gespeichert oder von ihnen verwendet werden. Eine generische Auflistungsklasse kann beispielsweise einen Typparameter als Platzhalter für den Typ von Objekten enthalten, die in ihm gespeichert sind. Die Typparameter stellen die Typen ihrer Felder und die Parametertypen ihrer Methoden dar. Eine generische Methode kann beispielsweise ihren Typparameter als den Typ ihres Rückgabewerts oder als den Typ einer ihrer formalen Parameter verwenden. Im folgenden Code wird eine einfache generische Klassendefinition veranschaulicht.
Public Class Generic(Of T)
Public Field As T
End Class
public class Generic<T>
{
public T Field;
}
generic<typename T> public ref class Generic
{
public:
T Field;
};
Beim Erstellen der Instanz einer generischen Klasse geben Sie die tatsächlichen Typen an, durch die die Typparameter ersetzt werden sollen. Dadurch wird eine generische Klasse erstellt, die so genannte konstruierte generische Klasse, bei der alle Vorkommen der Typparameter durch die ausgewählten Typen ersetzt sind. Das Ergebnis ist eine typsichere an die ausgewählten Typen angepasste Klasse, wie im folgenden Code veranschaulicht wird.
Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";
Generika-Terminologie
Die folgenden Begriffe werden in Bezug auf Generika in .NET Framework verwendet:
Die generische Typdefinition ist eine Klassen-, Struktur- oder Schnittstellendeklaration, die als Vorlage fungiert und Platzhalter für die Typen besitzt, die sie enthalten oder verwenden kann. Beispielsweise kann die Dictionary<TKey, TValue>-Klasse zwei Typen enthalten: Schlüssel und Werte. Da es sich lediglich um eine Vorlage handelt, können keine Instanzen einer Klasse, Struktur oder Schnittstelle erstellt werden, die eine generische Typdefinition darstellt.
Generische Typparameter oder Typparameter sind die Platzhalter in einer generischen Typ- oder Methodendefinition. Der generische Dictionary<TKey, TValue>-Typ besitzt die beiden Typparameter TKey und TValue, die die Typen seiner Schlüssel und Werte darstellen.
Ein konstruierter generischer Typ oder konstruierter Typ bezeichnet das Ergebnis der Angabe von Typen für die generischen Typparameter einer generischen Typdefinition.
Ein generisches Typargument ist jeder Typ, der durch einen generischen Typparameter ausgetauscht wird.
Der allgemeine Begriff "generischer Typ" schließt sowohl konstruierte Typen als auch generische Typdefinitionen ein.
Einschränkungen sind Begrenzungen, denen generische Typparameter unterliegen. Beispielsweise können Sie einen Typparameter auf Typen einschränken, die die generische IComparer<T>-Schnittstelle implementieren, um sicherzustellen, dass Instanzen des Typs sortiert werden können. Sie können auch Typparameter auf Typen einschränken, die eine bestimmte Basisklasse mit einem Standardkonstruktor besitzen oder Verweistypen oder Werttypen darstellen. Implementierungen, die den generischen Typ verwenden, können dann keine Typargumente ersetzen, die die Einschränkungen nicht erfüllen.
Eine generische Methodendefinition stellt eine Methode mit zwei Parameterlisten dar: eine Liste der generischen Typparameter und eine Liste der formalen Parameter. Typparameter können als Rückgabetyp oder als Typen der formalen Parameter auftreten, wie im folgenden Code veranschaulicht wird.
Function Generic(Of T)(ByVal arg As T) As T Dim temp As T = arg ... End Function
T Generic<T>(T arg) { T temp = arg; ...}
generic<typename T> T Generic(T arg) { T temp = arg; ...};
Generische Methoden können in generischen oder nicht generischen Typen verwendet werden. Beachten Sie, dass eine Methode nicht notwendigerweise eine generische Methode ist, weil sie zu einem generischen Typ gehört oder weil sie formale Parameter besitzt, deren Typen die generischen Parameter des einschließenden Typs sind. Eine Methode ist nur dann generisch, wenn sie eine eigene Liste von Typparametern besitzt. Im folgenden Code ist nur die Methode G generisch.
Class A Function G(Of T)(ByVal arg As T) As T ... End Function End Class Class Generic(Of T) Function M(ByVal arg As T) As T ... End Function End Class
class A { T G<T>(T arg) {...} } class Generic<T> { T M(T arg) {...} }
ref class A { generic<T> T G(T arg) {...}; }; generic<typename T> ref class Generic { T M(T arg) {...}; };
Visual C++, C# und Visual Basic unterstützen alle das Definieren und Verwenden von Generika. Weitere Informationen finden Sie unter Generische Typen in Visual Basic, Einführung in Generika (C#-Programmierhandbuch) und unter Overview of Generics in Visual C++.
Geschachtelte Typen und Generika
Ein in einem generischen Typ geschachtelter Typ kann von den Typparametern des einschließenden generischen Typs abhängen. Die Common Language Runtime betrachtet geschachtelte Typen als generisch, auch wenn sie über keine eigenen generischen Typparameter verfügen. Beim Erstellen einer Instanz eines geschachtelten Typs müssen Typargumente für alle einschließenden generischen Typen angegeben werden.
Siehe auch
Aufgaben
Gewusst wie: Definieren eines generischen Typs mit Reflektionsausgabe
Konzepte
Verwenden von generischen Auflistungen
Generische Typen in Visual Basic
Overview of Generics in Visual C++
Generische Auflistungen in .NET Framework
Generische Delegaten zum Bearbeiten von Arrays und Listen
Vorteile und Einschränkungen von Generika
Referenz
System.Collections.ObjectModel
Einführung in Generika (C#-Programmierhandbuch)
Weitere Ressourcen
Häufig verwendete Auflistungstypen