Generics in .NETGenerics in .NET

Mit Generics können Sie eine Methode, Klasse, Struktur oder Schnittstelle genau an den Datentyp anpassen, der von ihnen verarbeitet wird.Generics let you tailor a method, class, structure, or interface to the precise data type it acts upon. Anstatt beispielsweise die Hashtable -Klasse zu verwenden, bei der Schlüssel und Werte einen beliebigen Typ haben dürfen, können Sie die generische Klasse Dictionary<TKey,TValue> verwenden und den für den Schlüssel und Wert zulässigen Typ angeben.For example, instead of using the Hashtable class, which allows keys and values to be of any type, you can use the Dictionary<TKey,TValue> generic class and specify the type allowed for the key and the type allowed for the value. Zu den Vorteilen von Generics zählen bessere Wiederverwendbarkeit des Codes und Typsicherheit.Among the benefits of generics are increased code reusability and type safety.

Definieren und Verwenden von GenericsDefining and Using Generics

Generics sind Klassen, Strukturen, Schnittstellen und Methoden, die über Platzhalter (Typparameter) für einen oder mehrere der Typen verfügen, die sie speichern oder verwenden.Generics are classes, structures, interfaces, and methods that have placeholders (type parameters) for one or more of the types that they store or use. Eine generische Auflistungsklasse kann beispielsweise einen Typparameter als Platzhalter für den Typ von Objekten verwenden, die in ihr gespeichert werden; die Typparameter werden als die Typen ihrer Felder und die Parametertypen ihrer Methoden angezeigt.A generic collection class might use a type parameter as a placeholder for the type of objects that it stores; the type parameters appear as the types of its fields and the parameter types of its methods. Eine generische Methode kann ihren Typparameter als den Typen ihres Rückgabewerts oder als den Typen einer ihrer formalen Parameter verwenden.A generic method might use its type parameter as the type of its return value or as the type of one of its formal parameters. Der folgende Code zeigt eine einfache generische Klassendefinition.The following code illustrates a simple generic class definition.

generic<typename T>
public ref class Generics
{
public:
    T Field;
};
public class Generic<T>
{
    public T Field;
}
Public Class Generic(Of T)
    Public Field As T

End Class

Beim Erstellen einer Instanz einer generischen Klasse geben Sie die tatsächlich zu ersetzenden Typen für die Typparameter an.When you create an instance of a generic class, you specify the actual types to substitute for the type parameters. Dadurch wird eine neue generische Klasse eingerichtet, die als konstruierte generische Klasse bezeichnet wird, wobei die ausgewählten Typen überall dort, wo die Typparameter angezeigt werden, ersetzt werden.This establishes a new generic class, referred to as a constructed generic class, with your chosen types substituted everywhere that the type parameters appear. Das Ergebnis ist eine typsichere Klasse, die auf die ausgewählten Typen zugeschnitten ist, wie im folgenden Code veranschaulicht wird.The result is a type-safe class that is tailored to your choice of types, as the following code illustrates.

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);
}
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);
}
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

Generics-TerminologieGenerics terminology

Die folgenden Begriffe werden bei der Erörterung von Generics in .NET verwendet:The following terms are used to discuss generics in .NET:

  • Eine 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.A generic type definition is a class, structure, or interface declaration that functions as a template, with placeholders for the types that it can contain or use. Die System.Collections.Generic.Dictionary<TKey,TValue> -Klasse kann beispielsweise zwei Typen enthalten: Schlüssel und Werte.For example, the System.Collections.Generic.Dictionary<TKey,TValue> class can contain two types: keys and values. Da eine generische Typdefinition lediglich eine Vorlage ist, können Sie keine Instanzen einer Klasse, Struktur oder Schnittstelle erstellen, die eine generische Typdefinition ist.Because a generic type definition is only a template, you cannot create instances of a class, structure, or interface that is a generic type definition.

  • Generische Typparameter, oder Typparameter, sind die Platzhalter in einer generischen Typ- oder Methodendefinition.Generic type parameters, or type parameters, are the placeholders in a generic type or method definition. Der generische Typ System.Collections.Generic.Dictionary<TKey,TValue> verfügt über zwei Typparameter, TKey und TValue, die die Typen seiner Schlüssel und Werte darstellen.The System.Collections.Generic.Dictionary<TKey,TValue> generic type has two type parameters, TKey and TValue, that represent the types of its keys and values.

  • Ein konstruierter generischer Typ, oder konstruierter Typ, ist das Ergebnis der Angabe von Typen für die generischen Typparameter einer generischen Typdefinition.A constructed generic type, or constructed type, is the result of specifying types for the generic type parameters of a generic type definition.

  • Ein generisches Typargument ist jeder Typ, der durch einen generischen Typparameter ersetzt wird.A generic type argument is any type that is substituted for a generic type parameter.

  • Der allgemeine Begriff generischer Typ schließt sowohl konstruierte Typen als auch generische Typdefinitionen ein.The general term generic type includes both constructed types and generic type definitions.

  • Kovarianz und Kontravarianz der generischen Typparameter ermöglichen es Ihnen, konstruierte generische Typen zu verwenden, deren Typargumente stärker abgeleitet (Kovarianz) oder weniger stark abgeleitet (Kontravarianz) sind als ein konstruierter Zieltyp.Covariance and contravariance of generic type parameters enable you to use constructed generic types whose type arguments are more derived (covariance) or less derived (contravariance) than a target constructed type. Kovarianz und Kontravarianz werden zusammen als Varianzbezeichnet.Covariance and contravariance are collectively referred to as variance. Weitere Informationen finden Sie unter Kovarianz und Kontravarianz.For more information, see Covariance and Contravariance.

  • Einschränkungen sind Begrenzungen für generische Typparameter.Constraints are limits placed on generic type parameters. Sie können beispielsweise einen Typparameter auf Typen beschränken, die die generische Schnittstelle System.Collections.Generic.IComparer<T> implementieren, um sicherzustellen, dass Instanzen des Typs sortiert werden können.For example, you might limit a type parameter to types that implement the System.Collections.Generic.IComparer<T> generic interface, to ensure that instances of the type can be ordered. Sie können Typparameter auch auf Typen mit einer bestimmten Basisklasse beschränken, die über einen parameterlosen Konstruktor verfügen oder die Verweis- oder Werttypen sind.You can also constrain type parameters to types that have a particular base class, that have a parameterless constructor, or that are reference types or value types. Benutzer des generischen Typs können keine Typargumente ersetzen, die die Einschränkungen nicht erfüllen.Users of the generic type cannot substitute type arguments that do not satisfy the constraints.

  • Eine generische Methodendefinition ist eine Methode mit zwei Parameterlisten: eine Liste der generischen Typparameter und eine Liste der formalen Parameter.A generic method definition is a method with two parameter lists: a list of generic type parameters and a list of formal parameters. Typparameter können als Rückgabetyp oder als Typen der formalen Parameter auftreten, wie im folgenden Code dargestellt.Type parameters can appear as the return type or as the types of the formal parameters, as the following code shows.

generic<typename T>
T Generic(T arg)
{
    T temp = arg;
    //...
    return temp;
}
T Generic<T>(T arg)
{
    T temp = arg;
    //...
    return temp;
}
Function Generic(Of T)(ByVal arg As T) As T
    Dim temp As T = arg
    '...
    Return temp
End Function

Generische Methoden können in generischen oder nicht generischen Typen stehen.Generic methods can appear on generic or nongeneric types. Beachten Sie unbedingt, dass eine Methode nicht nur deshalb generisch 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.It is important to note that a method is not generic just because it belongs to a generic type, or even because it has formal parameters whose types are the generic parameters of the enclosing type. Eine Methode ist nur generisch, wenn sie über eine eigene Liste an Typparametern verfügt.A method is generic only if it has its own list of type parameters. Im folgenden Code ist nur die Methode G generisch.In the following code, only method G is generic.

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;
    }
};
class A
{
    T G<T>(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
class Generic<T>
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
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

Vor- und Nachteile von GenericsAdvantages and disadvantages of generics

Es gibt viele Vorteile für die Verwendung von generischen Auflistungen und Delegaten:There are many advantages to using generic collections and delegates:

  • Typsicherheit.Type safety. Generics übertragen die Last der Typsicherheit an den Compiler.Generics shift the burden of type safety from you to the compiler. Es ist nicht erforderlich, dass Sie Code schreiben, um auf den richtigen Datentyp hin zu testen, da dieser zum Zeitpunkt der Kompilierung erzwungen wird.There is no need to write code to test for the correct data type because it is enforced at compile time. Die Notwendigkeit einer Typumwandlung und die Möglichkeit von Laufzeitfehlern werden verringert.The need for type casting and the possibility of run-time errors are reduced.

  • Es ist weniger Code erforderlich, und Code kann leichter wiederverwendet werden.Less code and code is more easily reused. Die Vererbung von einem Basistyp oder das Überschreiben von Membern ist nicht erforderlich.There is no need to inherit from a base type and override members. LinkedList<T> ist beispielsweise sofort einsatzbereit.For example, the LinkedList<T> is ready for immediate use. So können Sie mit der folgenden Variablendeklaration eine verknüpfte Liste von Zeichenfolgen erstellen:For example, you can create a linked list of strings with the following variable declaration:

    LinkedList<String^>^ llist = gcnew LinkedList<String^>();
    
    LinkedList<string> llist = new LinkedList<string>();
    
    Dim llist As New LinkedList(Of String)()
    
  • Bessere Leistung.Better performance. Generische Auflistungstypen bieten im Allgemeinen eine bessere Leistung zum Speichern und Bearbeiten von Werttypen, da das Boxing von Werttypen nicht erforderlich ist.Generic collection types generally perform better for storing and manipulating value types because there is no need to box the value types.

  • Generische Delegaten ermöglichen typsichere Rückrufe, ohne mehrere Delegatklassen erstellen zu müssen.Generic delegates enable type-safe callbacks without the need to create multiple delegate classes. Der generische Delegat Predicate<T> ermöglicht es Ihnen beispielsweise, Ihre eigenen Suchkriterien für einen bestimmten Typ zu implementieren und Ihre Methode für Methoden vom Typ Array zu verwenden, z. B. Find, FindLastund FindAll.For example, the Predicate<T> generic delegate allows you to create a method that implements your own search criteria for a particular type and to use your method with methods of the Array type such as Find, FindLast, and FindAll.

  • Generics optimieren dynamisch generierten Code.Generics streamline dynamically generated code. Wenn Sie Generics mit dynamisch generiertem Code verwenden, müssen Sie nicht den Typ generieren.When you use generics with dynamically generated code you do not need to generate the type. Dies erhöht die Anzahl der Szenarios, in denen Sie einfache dynamische Methoden verwenden können, anstatt ganze Assemblys zu generieren.This increases the number of scenarios in which you can use lightweight dynamic methods instead of generating entire assemblies. Weitere Informationen finden Sie unter Vorgehensweise: Definieren und Ausführen von dynamischen Methoden und DynamicMethod.For more information, see How to: Define and Execute Dynamic Methods and DynamicMethod.

Es folgen einige Einschränkungen von Generics:The following are some limitations of generics:

  • Generische Typen können von den meisten Basisklassen abgeleitet werden, z. B. MarshalByRefObject (und Einschränkungen können verwendet werden, um festzulegen, dass generische Typparameter von Basisklassen wie MarshalByRefObjectabgeleitet werden).Generic types can be derived from most base classes, such as MarshalByRefObject (and constraints can be used to require that generic type parameters derive from base classes like MarshalByRefObject). .NET Framework unterstützt allerdings keine kontextgebundenen generischen Typen.However, the .NET Framework does not support context-bound generic types. Ein generischer Typ kann von ContextBoundObjectabgeleitet werden, aber wenn Sie versuchen, eine Instanz dieses Typs zu erstellen, wird eine TypeLoadExceptionausgelöst.A generic type can be derived from ContextBoundObject, but trying to create an instance of that type causes a TypeLoadException.

  • Enumerationen können keine generischen Typparameter haben.Enumerations cannot have generic type parameters. Eine Enumeration kann nur durch Zufall generisch sein (z. B. weil sie in einem generischen Typ verschachtelt ist, der mit Visual Basic, C# oder C++ definiert wurde).An enumeration can be generic only incidentally (for example, because it is nested in a generic type that is defined using Visual Basic, C#, or C++). Weitere Informationen finden Sie im Abschnitt "Enumerationen" unter Allgemeines Typsystem.For more information, see "Enumerations" in Common Type System.

  • Einfache dynamische Methoden können nicht generisch sein.Lightweight dynamic methods cannot be generic.

  • In Visual Basic, C# und C++ kann ein geschachtelter Typ, der in einem generischen Typ eingeschlossen ist, nicht instanziiert werden, es sei denn, die Typen wurden den Typparametern aller einschließenden Typen zugewiesen.In Visual Basic, C#, and C++, a nested type that is enclosed in a generic type cannot be instantiated unless types have been assigned to the type parameters of all enclosing types. Anders ausgedrückt: Ein geschachtelter Typ, der mit diesen Sprachen definiert wurde, enthält bei näherer Betrachtung die Typparameter aller einschließenden Typen.Another way of saying this is that in reflection, a nested type that is defined using these languages includes the type parameters of all its enclosing types. Dadurch können die Typparameter von einschließenden Typen in den Memberdefinitionen eines geschachtelten Typs verwendet werden.This allows the type parameters of enclosing types to be used in the member definitions of a nested type. Weitere Informationen finden Sie unter "Geschachtelte Typen" in MakeGenericType.For more information, see "Nested Types" in MakeGenericType.

    Hinweis

    Ein geschachtelter Typ, der durch Ausgabe von Code in einer dynamischen Assembly oder durch Verwendung von Ilasm.exe (IL -Assembler) definiert wird, ist nicht erforderlich, um die Typparameter seiner einschließenden Typen zu beinhalten; wenn sie jedoch nicht enthalten sind, befinden sich die Typparameter nicht im Gültigkeitsbereich der geschachtelten Klasse.A nested type that is defined by emitting code in a dynamic assembly or by using the Ilasm.exe (IL Assembler) is not required to include the type parameters of its enclosing types; however, if it does not include them, the type parameters are not in scope in the nested class.

    Weitere Informationen finden Sie unter "Geschachtelte Typen" in MakeGenericType.For more information, see "Nested Types" in MakeGenericType.

Klassenbibliothek und SprachunterstützungClass Library and Language Support

.NET bietet eine Reihe generischer Auflistungsklassen in den folgenden Namespaces:.NET provides a number of generic collection classes in the following namespaces:

Generische Schnittstellen für die Implementierung von Sortier- und Übereinstimmungsvergleichen finden Sie im System -Namespace zusammen mit generischen Delegattypen für Ereignishandler, Konvertierungen und Suchprädikate.Generic interfaces for implementing sort and equality comparisons are provided in the System namespace, along with generic delegate types for event handlers, conversions, and search predicates.

Dem System.Reflection -Namespace wurde Unterstützung für Generics hinzugefügt, um generische Typen und generische Methoden zu überprüfen. Sie wurde auch System.Reflection.Emit zum Ausgeben von dynamischen Assemblys mit generischen Typen und Methoden und System.CodeDom zum Generieren von Quelldiagrammen mit Generics hinzugefügt.Support for generics has been added to the System.Reflection namespace for examining generic types and generic methods, to System.Reflection.Emit for emitting dynamic assemblies that contain generic types and methods, and to System.CodeDom for generating source graphs that include generics.

Die Common Language Runtime bietet neue Opcodes und Präfixe für die Unterstützung generischer Typen in Microsoft Intermediate Language (MSIL), darunter Stelem, Ldelem, Unbox_Any, Constrainedund Readonly.The common language runtime provides new opcodes and prefixes to support generic types in Microsoft intermediate language (MSIL), including Stelem, Ldelem, Unbox_Any, Constrained, and Readonly.

Visual C++, C# und Visual Basic bieten alle vollständige Unterstützung für das Definieren und Verwenden von Generics.Visual C++, C#, and Visual Basic all provide full support for defining and using generics. Weitere Informationen zur Sprachunterstützung finden Sie unter Generische Typen in Visual Basic, Einführung in Generics und Übersicht über Generics in C++.For more information about language support, see Generic Types in Visual Basic, Introduction to Generics, and Overview of Generics in Visual C++.

Geschachtelte Typen und GenericsNested Types and Generics

Ein Typ, der in einem generischen Typ geschachtelt ist, kann von den Typparametern des einschließenden generischen Typs abhängen.A type that is nested in a generic type can depend on the type parameters of the enclosing generic type. Die Common Language Runtime betrachtet geschachtelte Typen als generisch, auch wenn sie keinen eigenen generischen Typparameter haben.The common language runtime considers nested types to be generic, even if they do not have generic type parameters of their own. Beim Erstellen einer Instanz eines geschachtelten Typs müssen Sie Typargumente für alle einschließenden generischen Typen festlegen.When you create an instance of a nested type, you must specify type arguments for all enclosing generic types.

TitelTitle BeschreibungDescription
Generische Sammlungen in .NETGeneric Collections in .NET Beschreibt generische Auflistungsklassen und andere generische Auflistungstypen in .NET.Describes generic collection classes and other generic types in .NET.
Generische Delegaten zum Bearbeiten von Arrays und ListenGeneric Delegates for Manipulating Arrays and Lists Beschreibt generische Delegate für Konvertierungen, Suchprädikate und Aktionen, die für Elemente eines Arrays oder einer Auflistung ausgeführt werden.Describes generic delegates for conversions, search predicates, and actions to be taken on elements of an array or collection.
Generische SchnittstellenGeneric Interfaces Beschreibt generische Schnittstellen, die allgemeine Funktionalität für Familien generischer Typen bereitstellen.Describes generic interfaces that provide common functionality across families of generic types.
Kovarianz und KontravarianzCovariance and Contravariance Beschreibt Kovarianz und Kontravarianz in generischen Typparametern.Describes covariance and contravariance in generic type parameters.
Häufig verwendete AuflistungstypenCommonly Used Collection Types Enthält zusammenfassende Informationen über die Merkmale und Verwendungsszenarios der Auflistungstypen in .NET, einschließlich generischer Typen.Provides summary information about the characteristics and usage scenarios of the collection types in .NET, including generic types.
Verwenden von generischen AuflistungenWhen to Use Generic Collections Beschreibt die allgemeinen Regeln, um festzulegen, wann generische Auflistungstypen verwendet werden können.Describes general rules for determining when to use generic collection types.
Vorgehensweise: Definieren eines generischen Typs mit ReflektionsausgabeHow to: Define a Generic Type with Reflection Emit Erläutert das Generieren dynamischer Assemblys, die generische Typen und Methoden enthalten.Explains how to generate dynamic assemblies that include generic types and methods.
Generische Typen in Visual Basic (Visual Basic)Generic Types in Visual Basic Beschreibt das Genericsfeature für Visual Basic-Benutzer, darunter Gewusst-wie-Themen zum Verwenden und Definieren generischer Typen.Describes the generics feature for Visual Basic users, including how-to topics for using and defining generic types.
Einführung in GenericsIntroduction to Generics Bietet eine Übersicht über das Definieren und Verwenden generischer Typen für C#-Benutzer.Provides an overview of defining and using generic types for C# users.
Übersicht über Generics in Visual C++Overview of Generics in Visual C++ Beschreibt das Genericsfeature für C++-Benutzer, darunter die Unterschiede zwischen Generics und Vorlagen.Describes the generics feature for C++ users, including the differences between generics and templates.

ReferenzReference

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes