Obecné třídy a metody

Obecné typy zavádí koncept parametrů typu do .NET, který umožňuje navrhnout třídy a metody, které odloží specifikaci jednoho nebo více typů, dokud třída nebo metoda není deklarována a vytvořena instance klientským kódem. Například pomocí parametru Tobecného typu můžete napsat jednu třídu, kterou může použít jiný klientský kód, aniž by to způsoboval náklady nebo riziko v důsledku přetypování za běhu nebo operací balení, jak je znázorněno tady:

// 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í opětovnou použitelnost, bezpečnost typů a účinnost způsobem, který jejich negenerové 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 obecných tříd kolekcí. Kolekce, které nejsou obecné, se ArrayList nedoporučují a uchovávají se pro účely kompatibility. Další informace najdete v tématu Obecné typy v .NET.

Můžete také vytvořit vlastní obecné typy a metody pro poskytování vlastních zobecněných řešení a vzorů návrhu, které jsou typově bezpečné a efektivní. Následující příklad kódu ukazuje jednoduchou třídu obecného propojeného seznamu pro demonstrační účely. (Ve většině případů byste měli místo vytváření vlastní použít List<T> třídu, kterou .NET poskytuje.) Parametr T type se používá na několika místech, 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ý Data typ vlastnosti ve vnořené Node třídě.
  • Jako typ soukromého člena data ve vnořené třídě.

T je k dispozici pro vnořenou Node třídu. Pokud GenericList<T> je instance vytvořena s konkrétním typem, například jako GenericList<int>, bude každý výskyt T nahrazen intza .

// 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 klientský kód používá obecnou GenericList<T> třídu k vytvoření seznamu celých čísel. Jednoduše změnou argumentu typu lze následující kód snadno upravit tak, aby se vytvořily 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ů

  • Pomocí obecných typů můžete maximalizovat opakované použití kódu, bezpečnost typů a výkon.
  • Nejběžnějším využitím obecných typů je vytvoření tříd kolekcí.
  • Knihovna .NET tříd obsahuje několik obecných tříd kolekce v System.Collections.Generic oboru názvů. Obecné kolekce by se měly používat, kdykoli je to možné, místo tříd, jako ArrayList je v System.Collections oboru 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 umožňovaly přístup k metodám na konkrétních datových typech.
  • Informace o typech, které se používají 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é