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 T
obecné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 int
za .
// 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#.