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í parametru 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í boxingu vynačítá, jak je znázorněno T 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 vytváření vlastní třídy poskytované List<T> rozhraním .NET použít třídu .NET.) Parametr typu se používá v několika umístěních, kde se obvykle používá konkrétní typ k označení typu položky T uložené v seznamu. Používá se následujícími způsoby:

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

T je k dispozici pro vnořenou Node třídu. Pokud je vytvořena instance s konkrétním typem, například jako , nahradí se každý výskyt GenericList<T> GenericList<int> T 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 GenericList<T> třídu 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 ArrayList je například v oboru názvů System.Collections .
  • 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é