Vorteile und Einschränkungen von Generika

Durch die Möglichkeit, die Typen anzugeben, die von einer generischen Klasse oder Methode verarbeitet werden, wird die Aufgabe der Typsicherheit vom Benutzer auf den Compiler übertragen. Es ist nicht erforderlich, den richtigen Datentyp im Code zu überprüfen, da dieser zur Kompilierungszeit erzwungen wird. Die Notwendigkeit von Typumwandlungen und die Wahrscheinlichkeit von Laufzeitfehlern werden verringert.

Generika bieten Typsicherheit ohne den Verwaltungsaufwand mehrfacher Implementierungen. Beispielsweise können Sie mit der folgenden Variablendeklaration eine verknüpfte Liste von Zeichenfolgen erstellen:

Dim llist As New LinkedList(Of String)()
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

Dazu müssen keine Basistypen geerbt oder Member überschrieben werden. Die verknüpfte Liste kann direkt verwendet werden. Die von .NET Framework bereitgestellten generischen Auflistungstypen finden Sie unter System.Collections.Generic und System.Collections.ObjectModel.

Zusätzlich zur Typsicherheit bieten generische Auflistungstypen eine allgemein bessere Leistung beim Speichern und Bearbeiten von Werttypen, da ein Boxing der Werttypen entfällt.

Generische Delegaten ermöglichen typsichere Rückrufe, ohne mehrere Delegatklassen erstellen zu müssen. Beispielsweise können Sie mit dem generischen Predicate<T>-Delegaten eine Methode erstellen, die eigene Suchkriterien für einen bestimmten Typ implementiert. Diese Methode kann dann mit Methoden des Array-Typs wie Find<T>, FindLast<T> und FindAll<T> verwendet werden.

Generische Delegaten können auch in dynamisch generiertem Code verwendet werden, ohne einen Delegattyp generieren zu müssen. Dadurch erhöht sich die Anzahl der Szenarios, in denen Sie einfache dynamische Methoden verwenden können, anstelle ganze Assemblys zu generieren. Weitere Informationen finden Sie unter Gewusst wie: Definieren und Ausführen von dynamischen Methoden und DynamicMethod.

In vielen Fällen sind die Compiler für Visual Basic, Visual C++ und C# in der Lage, vom Kontext auf die Typen zu schließen, die in einem Aufruf einer generischen Methode verwendet werden. Dadurch wird die Syntax für die Verwendung generischer Methoden deutlich vereinfacht. Beispielsweise veranschaulicht folgender Code die Kurz- und Langform eines Aufrufs der generischen BinarySearch-Methode zum Durchsuchen eines Arrays von Zeichenfolgen. In der Kurzform leitet der Compiler den korrekten Typparameter aus den Typen der Methodenargumente ab.

Dim index0 As Integer = Array.BinarySearch(myArray, "test string")
Dim index1 As Integer = Array.BinarySearch(Of String)(myArray, "test string")
int index0 = Array.BinarySearch(myArray, "test string");
int index1 = Array.BinarySearch<string>(myArray, "test string");
int index0 = Array::BinarySearch(myArray, "test string");
int index1 = Array::BinarySearch<String^>(myArray, "test string");

Einschränkungen von Generika

Im Folgenden finden Sie Einschränkungen von Generika in .NET Framework, Version 2.0:

  • Generische Typen können von den meisten Basisklassen, z. B. MarshalByRefObject, abgeleitet werden (und mithilfe von Einschränkungen kann erzwungen werden, dass generische Typparameter von Basisklassen wie MarshalByRefObject abgeleitet werden). Diese Version von .NET Framework unterstützt jedoch keine kontextgebundenen generischen Typen. Ein generischer Typ kann zwar von ContextBoundObject abgeleitet werden, beim Versuch, eine Instanz dieses Typs zu erstellen, wird jedoch eine TypeLoadException ausgelöst.

  • Enumerationen können über keine generischen Typparameter verfügen. Eine Enumeration kann nur zufällig generisch sein (z. B. weil sie in einem generischen Typ geschachtelt ist, der mit Visual Basic, C# oder C++ definiert ist). Weitere Informationen finden Sie im Abschnitt "Enumerationen" unter Allgemeines Typsystem.

  • Einfache dynamische Methoden können nicht generisch sein. Weitere Informationen zu dynamischen Methoden finden Sie unter Szenarien für die Reflektionsausgabe mit dynamischen Methoden.

  • In Visual Basic, C# und C++ kann ein in einem generischen Typ eingeschlossener geschachtelter Typ erst instanziiert werden, nachdem die Typen den Typparametern aller einschließenden Typen zugewiesen wurden. Anders ausgedrückt bedeutet dies, dass ein geschachtelter in diesen Programmiersprachen definierter Typ im Gegensatz dazu die Typparameter aller einschließenden Typen umfasst. Dadurch können die Typparameter einschließender Typen in den Memberdefinitionen eines geschachtelten Typs verwendet werden. Weitere Informationen finden Sie im Abschnitt "Geschachtelte Typen" unter MakeGenericType.

    HinweisHinweis

    Ein geschachtelter Typ, der durch Ausgabe von Code in einer dynamischen Assembly oder durch Verwendung von Ilasm.exe (MSIL-Assembler) definiert wurde, muss keine Typparameter seiner einschließenden Typen enthalten. Wenn er sie jedoch nicht enthält, befinden sich die Typparameter nicht im Bereich der geschachtelten Klasse.

    Weitere Informationen finden Sie im Abschnitt "Geschachtelte Typen" unter MakeGenericType.

Siehe auch

Referenz

System.Collections.Generic

System.Collections.ObjectModel

Konzepte

Generische Auflistungen in .NET Framework

Generische Delegaten zum Bearbeiten von Arrays und Listen

Generische Schnittstellen

Weitere Ressourcen

Generika in .NET Framework