Generika in .NET Framework

Mit Generika können Sie eine Methode, Klasse, Struktur oder Schnittstelle genau an den Datentyp anpassen, der von ihr verarbeitet wird. Beispielsweise können Sie anstelle der Hashtable-Klasse, die Schlüssel und Werte von beliebigem Typ zulässt, die generische Dictionary<TKey, TValue>-Klasse verwenden und jeweils den für Schlüssel und Wert zulässigen Typ angeben. Zu den Vorteilen von Generika zählen die bessere Codewiederverwendbarkeit und Typsicherheit.

In diesem Thema finden Sie eine Übersicht über Generika in .NET Framework sowie eine Zusammenfassung generischer Typen oder Methoden. Sie enthält die folgenden Abschnitte:

  • Definieren und Verwenden von Generika

  • Generika-Terminologie

  • Klassenbibliothek- und Sprachunterstützung

  • Geschachtelte Typen und Generika

  • Verwandte Themen

  • Verweise

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 Generics
{
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.

Public Shared Sub Main()
    Dim g As New Generic(Of String)
    g.Field = "A string"
    '...
    Console.WriteLine("Generic.Field           = ""{0}""", g.Field)
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
public static void Main()
{
    Generic<string> g = new Generic<string>();
    g.Field = "A string";
    //...
    Console.WriteLine("Generic.Field           = \"{0}\"", g.Field);
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
static void Main()
{
    Generics<String^>^ g = gcnew Generics<String^>();
    g->Field = "A string";
    //...
    Console::WriteLine("Generics.Field           = \"{0}\"", g->Field);
    Console::WriteLine("Generics.Field.GetType() = {0}", g->Field->GetType()->FullName);
}

Zurück nach oben

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 System.Collections.Generic.Dictionary<TKey, TValue>-Klasse zwei Typen enthalten: Schlüssel und Werte. Da eine generische Typdefinition lediglich eine Vorlage darstellt, 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 System.Collections.Generic.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.

  • Die Kovarianz und Kontravarianz von generischen Typparametern ermöglichen die Verwendung von konstruierten generischen Typen, deren Typargumente stärker abgeleitet (Kovarianz) oder weniger stark abgeleitet (Kontravarianz) sind als ein konstruierter Zieltyp. Kovarianz und Kontravarianz werden zusammen als Varianz bezeichnet. Weitere Informationen finden Sie unter Kovarianz und Kontravarianz in Generika.

  • Einschränkungen sind Begrenzungen, denen generische Typparameter unterliegen. Beispielsweise können Sie einen Typparameter auf Typen einschränken, die die generische System.Collections.Generic.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
    '...
    Return temp
End Function
T Generic<T>(T arg)
{
    T temp = arg;
    //...
    return temp;
}
generic<typename T>
T Generic(T arg)
{
    T temp = arg;
    //...
    return temp;
}

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
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
Class Generic(Of T)
    Function M(ByVal arg As T) As T
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
class A
{
    T G<T>(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
class Generic<T>
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
ref class A
{
    generic<typename T>
    T G(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};
generic<typename T>
ref class Generic
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};

Zurück nach oben

Klassenbibliothek- und Sprachunterstützung

.NET Framework enthält eine Reihe generischer Auflistungsklassen in den folgenden Namespaces:

Generische Schnittstellen für die Implementierung von Sortierfunktionen und Überprüfungen auf Gleichheit werden im System-Namespace zusammen mit generischen Delegattypen für Ereignishandlern, Konvertierungen und Suchprädikaten bereitgestellt.

Elemente, die um eine Unterstützung von Generika erweitert wurden, sind: System.Reflection-Namespace zum Untersuchen generischer Typen und generischer Methoden, System.Reflection.Emit zum Ausgeben von dynamischen Assemblys mit generischen Typen und Methoden und System.CodeDom zum generieren von Quelldiagrammen mit Generika.

Die Common Language Runtime bietet neue Opcodes und Präfixe für die Unterstützung generischer Typen in MSIL (Microsoft Intermediate Language), einschließlich Stelem, Ldelem, Unbox_Any, Constrained und Readonly.

Visual C++, C# und Visual Basic unterstützen alle das Definieren und Verwenden von Generika. Weitere Informationen zur Sprachunterstützung finden Sie unter Generische Typen in Visual Basic (Visual Basic), Einführung in Generika (C#-Programmierhandbuch) und unter Overview of Generics in Visual C++.

Zurück nach oben

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.

Zurück nach oben

Verwandte Themen

Titel

Beschreibung

Generische Auflistungen in .NET Framework

Beschreibt generischen Auflistungsklassen und andere generische Auflistungstypen in .NET Framework.

Generische Delegaten zum Bearbeiten von Arrays und Listen

Beschreibt generische Delegaten für Konvertierungen, Suchprädikate und Aktionen, die für Elemente eines Arrays oder einer Auflistung ausgeführt werden sollen.

Generische Schnittstellen

Beschreibt generische Schnittstellen, um die allgemeine Funktionalität für alle Familien generischer Typen bereitzustellen.

Kovarianz und Kontravarianz in Generika

Beschreibt Kovarianz und Kontravarianz in generischen Typparametern.

Vorteile und Einschränkungen von Generika

Fasst die Vorteile und die Beschränkungen in der Verwendung von Generika zusammen.

Häufig verwendete Auflistungstypen

Bietet eine Zusammenfassung der Merkmale und Verwendungsszenarios der Auflistungstypen in .NET Framework, einschließlich generischer Typen.

Verwenden von generischen Auflistungen

Beschreibt die allgemeinen Regeln für Situationen, in denen generische Auflistungstypen verwendet werden können.

Gewusst wie: Definieren eines generischen Typs mit Reflektionsausgabe

Erläutert das Generieren dynamischer Assemblys, die generische Typen und Methoden enthalten.

Generische Typen in Visual Basic (Visual Basic)

Beschreibt das Generikafeature für Visual Basic-Benutzer und enthält Gewusst-wie-Themen zum Verwenden und Definieren generischer Typen.

Einführung in Generika (C#-Programmierhandbuch)

Bietet eine Übersicht über das Definieren und Verwenden generischer Typen für C#-Benutzer.

Overview of Generics in Visual C++

Beschreibt das Generikafeature für C++-Benutzer, einschließlich der Unterschiede zwischen Generika und Vorlagen.

Zurück nach oben

Verweise

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes

Zurück nach oben