Obecné třídy a metody

Obecné typy zavádí koncept parametrů typu do rozhraní .NET, který umožňuje navrhnout třídy a metody, které odložit specifikaci jednoho nebo více typů, dokud nebude třída nebo metoda deklarována a vytvořena pomocí kódu klienta. Například pomocí Tparametru obecného typu můžete napsat jednu třídu, kterou může použít jiný klientský kód, aniž by to náklady nebo riziko přetypování modulu runtime nebo operací balení vykázaly, jak je znázorněno zde:

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

Obecné třídy a metody kombinují opakovatelnost, bezpečnost typů a efektivitu způsobem, který jejich neobecná protějšky nemohou. Obecné typy se nejčastěji používají s kolekcemi a metodami, které s nimi pracují. Obor System.Collections.Generic názvů obsahuje několik tříd kolekcí založených na obecných typech. Neobecná kolekce, například , ArrayList se nedoručují a udržují se pro účely kompatibility. Další informace najdete v tématu Obecné typy v .NET.

Můžete také vytvořit vlastní obecné typy a metody, které poskytují vlastní zobecněná řešení a vzory návrhu, které jsou typové a efektivní. Následující příklad kódu ukazuje jednoduchou obecnou třídu propojeného seznamu pro demonstrační účely. (Ve většině případů byste měli místo List<T> vytváření vlastní třídy poskytované rozhraním .NET použít třídu .NET.) Parametr typu se T používá v několika umístěních, kde se obvykle používá konkrétní typ k označení typu položky uložené v seznamu. Používá se následujícími způsoby:

  • Jako typ parametru metody v AddHead metodě .
  • Jako návratový typ vlastnosti Data ve vnořené třídě Node .
  • Jako typ soukromého členu data ve vnořené třídě.

T je k dispozici pro vnořenou Node třídu. Pokud GenericList<T> je vytvořena instance s konkrétním typem, GenericList<int>například jako , T nahradí se každý výskyt parametru za 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;
        }
    }
}

Následující příklad kódu ukazuje, jak kód klienta používá obecnou třídu GenericList<T> k vytvoření seznamu celých čísel. Jednoduše změnou argumentu typu je možné následující kód snadno upravit tak, aby vytvořil seznamy řetězců nebo jakýkoli jiný vlastní typ:

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

Přehled obecných typů

  • Obecné typy můžete použít k maximalizaci opětovného použití kódu, bezpečnosti typů a výkonu.
  • Nejběžnějším použitím obecných typů je vytvoření tříd kolekcí.
  • Knihovna tříd .NET obsahuje několik tříd obecné kolekce v oboru System.Collections.Generic názvů . Obecné kolekce by se měly používat vždy, když je to možné, místo tříd, jako je ArrayList například v oboru System.Collections názvů .
  • Můžete vytvořit vlastní obecná rozhraní, třídy, metody, události a delegáty.
  • Obecné třídy mohou být omezeny tak, aby povoloval přístup k metodám u konkrétních datových typů.
  • Informace o typech používaných v obecném datovém typu lze získat za běhu pomocí reflexe.

specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#.

Viz také