Einführung in Generika (C#-Programmierhandbuch)Introduction to Generics (C# Programming Guide)

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. Generika 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.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.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 Generika in der .NET Framework-Klassenbibliothek.For more information, see Generics in the .NET Framework Class Library.

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 der Rückgabetyp der öffentlichen Methode GetNext und der Eigenschaft Data in der geschachtelten Klasse Node.As the return type of the public method GetNext and the Data property in the nested Node class.

  • Als Typ der privaten Memberdaten 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");
    }
}

Siehe auchSee Also

System.Collections.Generic
C#-ProgrammierhandbuchC# Programming Guide
GenerikaGenerics