Typy ogólne (Przewodnik programowania w języku C#)Generics (C# Programming Guide)

Typy ogólne zostały dodane do wersji 2,0 C# języka i środowiska uruchomieniowego języka wspólnego (CLR).Generics were added to version 2.0 of the C# language and the common language runtime (CLR). Typy ogólne wprowadzają do .NET Framework koncepcji parametrów typu, które umożliwiają zaprojektowanie klas i metod, które opóźniają specyfikację jednego lub kilku typów do momentu zadeklarowania klasy lub metody jako wystąpienia przez kod klienta.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. Na przykład przy użyciu parametru typu ogólnego T można napisać pojedynczą klasę, która może być używana przez inny kod klienta, bez ponoszenia kosztów lub ryzyka związanego z rzutowaniem lub zapakowywaniem środowiska uruchomieniowego, jak pokazano poniżej: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());
    }
}

Klasy generyczne i metody łączą użyteczność, bezpieczeństwo typów i wydajność w taki sposób, że ich nieogólnymi odpowiednikami nie jest.Generic classes and methods combine reusability, type safety and efficiency in a way that their non-generic counterparts cannot. Typy ogólne są najczęściej używane z kolekcjami i metodami, które działają na nich.Generics are most frequently used with collections and the methods that operate on them. Wersja 2,0 biblioteki klas .NET Framework udostępnia nową przestrzeń nazw System.Collections.Generic, która zawiera kilka nowych klas kolekcji opartych na typach ogólnych.Version 2.0 of the .NET Framework class library provides a new namespace, System.Collections.Generic, which contains several new generic-based collection classes. Zaleca się, aby wszystkie aplikacje przeznaczone dla .NET Framework 2,0 i później używały nowych klas kolekcji ogólnej zamiast starszych nieogólnych odpowiedników, takich jak ArrayList.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. Aby uzyskać więcej informacji, zobacz typy ogólne w programie .NET.For more information, see Generics in .NET.

Oczywiście można również tworzyć niestandardowe typy ogólne i metody w celu udostępniania własnych uogólnionych rozwiązań i wzorców projektowych, które są bezpieczne i wydajne.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. Poniższy przykład kodu pokazuje prostą ogólną klasę listy połączonej w celach demonstracyjnych.The following code example shows a simple generic linked-list class for demonstration purposes. (W większości przypadków należy użyć List<T> klasy dostarczonej przez .NET Framework bibliotekę klas zamiast tworzyć własne.) Parametr T typu jest używany w kilku lokalizacjach, w których konkretny typ jest zwykle używany do wskazania typu elementu przechowywanego na liście.(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. Jest on używany w następujący sposób:It is used in the following ways:

  • Jako typ parametru metody w AddHead metodzie.As the type of a method parameter in the AddHead method.

  • Jako zwracany typ Data właściwości w klasie zagnieżdżonej Node .As the return type of the Data property in the nested Node class.

  • Jako typ prywatnego elementu członkowskiego data w klasie zagnieżdżonej.As the type of the private member data in the nested class.

Należy zauważyć, że T jest dostępny dla Node klasy zagnieżdżonej.Note that T is available to the nested Node class. Gdy GenericList<T> jest tworzona przy użyciu konkretnego typu, na przykład GenericList<int>jako, każde wystąpienie T zostanie zastąpione int.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;
        }
    }
}

Poniższy przykład kodu pokazuje, jak kod klienta używa klasy generycznej GenericList<T> do tworzenia listy liczb całkowitych.The following code example shows how client code uses the generic GenericList<T> class to create a list of integers. Po prostu poprzez zmianę argumentu typu można łatwo zmodyfikować następujący kod w celu utworzenia list ciągów lub dowolnego innego typu niestandardowego: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");
    }
}

Ogólne — przeglądGenerics Overview

  • Używaj typów ogólnych do maksymalizowania ponownego użycia kodu, bezpieczeństwa typów i wydajności.Use generic types to maximize code reuse, type safety, and performance.

  • Typowym zastosowaniem typów ogólnych jest utworzenie klas kolekcji.The most common use of generics is to create collection classes.

  • Biblioteka klas .NET Framework zawiera kilka nowych klas kolekcji ogólnych w System.Collections.Generic przestrzeni nazw.The .NET Framework class library contains several new generic collection classes in the System.Collections.Generic namespace. Powinny one być używane w miarę możliwości zamiast klas takich jak ArrayList System.Collections w przestrzeni nazw.These should be used whenever possible instead of classes such as ArrayList in the System.Collections namespace.

  • Można tworzyć własne interfejsy, klasy, metody, zdarzenia i Delegaty.You can create your own generic interfaces, classes, methods, events and delegates.

  • Klasy generyczne mogą być ograniczone, aby umożliwić dostęp do metod dla konkretnych typów danych.Generic classes may be constrained to enable access to methods on particular data types.

  • Informacje na temat typów, które są używane w ogólnym typie danych, można uzyskać w czasie wykonywania przy użyciu odbicia.Information on the types that are used in a generic data type may be obtained at run-time by using reflection.

Informacje dodatkowe:For more information:

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification.

Zobacz takżeSee also