Generics (C#-Programmierhandbuch)Generics (C# Programming Guide)

Generics wurden zur Version 2.0 der Sprache C# und der Common Language Runtime (CLR) hinzugefügt.Generics were added to version 2.0 of the C# language and the common language runtime (CLR). Generics führen in .NET Framework das Konzept der Typparameter ein, wodurch Sie Klassen und Methoden entwerfen können, die die Spezialisierung einer oder mehr Typen verzögern können, bis die Klasse oder Methode vom Clientcode deklariert und instanziiert wird.Generics introduce to the .NET Framework the concept of type parameters, which make it possible to design classes and methods that defer the specification of one or more types until the class or method is declared and instantiated by client code. Indem Sie z.B. einen generischen Parameter „T“ verwenden, können Sie eine einzelne Klasse schreiben, die anderer Clientcode verwenden kann, ohne die Kosten und Risiken von Umwandlungen zur Laufzeit oder Boxingvorgängen einzugehen, wie folgendermaßen gezeigt wird:For example, by using a generic type parameter T you can write a single class that other client code can use without incurring the cost or risk of runtime casts or boxing operations, as shown here:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        list3.Add(new ExampleClass());
    }
}

Generische Klassen und Methoden vereinen Wiederverwendbarkeit, Typsicherheit und Effizienz so, wie es ihre nicht generischen Gegenstücke nicht können.Generic classes and methods combine reusability, type safety and efficiency in a way that their non-generic counterparts cannot. Generics werden am häufigsten für Auflistungen und deren Methoden verwendet.Generics are most frequently used with collections and the methods that operate on them. Version 2.0 der .NET Framework-Klassenbibliothek bietet einen neuen Namespace, System.Collections.Generic, der mehrere neue generikabasierte Auflistungsklassen enthält.Version 2.0 of the .NET Framework class library provides a new namespace, System.Collections.Generic, which contains several new generic-based collection classes. Es wird empfohlen, dass alle Anwendungen für .NET Framework 2.0 und höher die neue generische Auflistungsklasse statt der älteren nicht generischen Gegenstücke wie etwa ArrayList verwenden.It is recommended that all applications that target the .NET Framework 2.0 and later use the new generic collection classes instead of the older non-generic counterparts such as ArrayList. Weitere Informationen finden Sie unter Generics in .NET.For more information, see Generics in .NET.

Sie können selbstverständlich auch benutzerdefinierte generische Typen und Methoden erstellen, um Ihre eigenen typsicheren und effizienten Lösungen und Entwurfsmuster bereitzustellen.Of course, you can also create custom generic types and methods to provide your own generalized solutions and design patterns that are type-safe and efficient. Das folgende Codebeispiel zeigt eine einfache generische linked-list-Klasse zur Veranschaulichung.The following code example shows a simple generic linked-list class for demonstration purposes. (In den meisten Fällen sollten Sie die Klasse List<T> verwenden., die von der .NET Framework-Klassenbibliothek bereitgestellt wird, statt Ihre eigene zu erstellen.) Der Typparameter T wird an mehreren Stellen verwendet, wo für gewöhnlich ein konkreter Typ verwendet werden würde, um den Typ des Elements anzugeben, das in der Liste gespeichert wurde.(In most cases, you should use the List<T> class provided by the .NET Framework class library instead of creating your own.) The type parameter T is used in several locations where a concrete type would ordinarily be used to indicate the type of the item stored in the list. Er wird wie folgt verwendet:It is used in the following ways:

  • Als Typ eines Methodenparameters in der Methode AddHead.As the type of a method parameter in the AddHead method.

  • Als Rückgabetyp der Eigenschaft Data in der geschachtelten Klasse Node.As the return type of the Data property in the nested Node class.

  • Als Typ des privaten Members data in der geschachtelten Klasse.As the type of the private member data in the nested class.

Beachten Sie, dass T für die geschachtelte Klasse Node zur Verfügung steht.Note that T is available to the nested Node class. Wenn GenericList<T> mit einem konkreten Typ instanziiert wird, beispielsweise als GenericList<int>, wird jedes T durch int ersetzt.When GenericList<T> is instantiated with a concrete type, for example as a GenericList<int>, each occurrence of T will be replaced with int.

// type parameter T in angle brackets
public class GenericList<T> 
{
    // The nested class is also generic on T.
    private class Node
    {
        // T used in non-generic constructor.
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
        
        // T as private member data type.
        private T data;

        // T as return type of property.
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    
    // constructor
    public GenericList() 
    {
        head = null;
    }

    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

Das folgende Codebeispiel zeigt, wie Clientcode die generische Klasse GenericList<T> verwendet, um eine Ganzzahlliste zu erstellen.The following code example shows how client code uses the generic GenericList<T> class to create a list of integers. Indem Sie einfach das Typargument ändern, kann der folgende Code ganz leicht so modifiziert werden, dass er Zeichenfolgenlisten oder jeden anderen benutzerdefinierten Typ erstellt:Simply by changing the type argument, the following code could easily be modified to create lists of strings or any other custom type:

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

Übersicht über GenericsGenerics Overview

  • Verwenden Sie Generics, um die Wiederverwendung von Code, Typsicherheit und Leistung zu maximieren.Use generic types to maximize code reuse, type safety, and performance.

  • Generics werden am häufigsten zur Erstellung von Auflistungsklassen verwendet.The most common use of generics is to create collection classes.

  • Die Klassenbibliothek von .NET Framework enthält eine Reihe generischer Auflistungsklassen im System.Collections.Generic-Namespace.The .NET Framework class library contains several new generic collection classes in the System.Collections.Generic namespace. Diese sollten wenn möglich anstatt Klassen wie z.B. ArrayList im System.Collections-Namespace verwendet werden.These should be used whenever possible instead of classes such as ArrayList in the System.Collections namespace.

  • Sie können Ihre eigenen generischen Schnittstellen, Klassen, Methoden, Ereignisse und Delegaten erstellen.You can create your own generic interfaces, classes, methods, events and delegates.

  • Generische Klassen sind womöglich in der Aktivierung des Zugriffs auf Methoden für bestimmte Datentypen beschränkt.Generic classes may be constrained to enable access to methods on particular data types.

  • Informationen zu den Typen, die in einem generischen Datentyp verwendet werden, können zur Laufzeit unter Verwendung von Reflektion abgerufen werden.Information on the types that are used in a generic data type may be obtained at run-time by using reflection.

Weitere Informationen finden Sie unter:For more information:

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification.

Siehe auchSee also