Sdílet prostřednictvím


Obecné typy v rozhraní .NET Framework

Obecné typy umožňují přizpůsobit metodu, třídu, strukturu nebo rozhraní pro přesný datový typ, se kterým se pracuje. Například namísto použití třídy Hashtable, která umožňuje, aby byly klíče a hodnoty libovolného typu, můžete použít obecnou třídu Dictionary<TKey, TValue> a určit povolený typ klíče a povolený typ hodnoty. Mezi výhody obecných typů patří zvýšená možnost opětovného použití kódu a typová bezpečnost.

Toto téma poskytuje přehled obecných typů v rozhraní .NET Framework a souhrn obecných typů nebo metod. Obsahuje následující části:

  • Definování a použití obecných typů

  • Terminologie obecných typů

  • Knihovna tříd a podpora jazyků

  • Vnořené typy a obecné typy

  • Příbuzná témata

  • Odkaz

Definování a použití obecných typů

Obecné typy jsou třídy, struktury, rozhraní a metody, které mají zástupné symboly (typové parametry) pro jeden nebo více typů, které ukládají nebo používají. Třída obecné kolekce může použít typový parametr jako zástupný symbol pro typ objektů, které uchovává; typové parametry se jeví jako typy položek dané třídy a jako typy parametrů metod dané třídy. Obecná metoda může použít typový parametr jako typ vlastní návratové hodnoty nebo jako typ některého z formálních parametrů dané metody. Následující kód ilustruje jednoduchou definici obecné třídy.

Public Class Generic(Of T)
    Public Field As T

End Class
public class Generic<T>
{
    public T Field;
}
generic<typename T>
public ref class Generics
{
public:
    T Field;
};

Při vytváření instance obecné třídy jsou zadány skutečné typy, které nahradí typové parametry. Tím je vytvořena nová obecná třída, odkazovaná jako konstruovaná obecná třída, s vašimi vybranými typy nahrazující všechny výskyty typových parametrů. Výsledkem je typově bezpečná třída, která je přizpůsobena vašemu výběru typů, jak je ukázáno v následujícím kódu.

Public Shared Sub Main()
    Dim g As New Generic(Of String)
    g.Field = "A string"
    '...
    Console.WriteLine("Generic.Field           = ""{0}""", g.Field)
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
public static void Main()
{
    Generic<string> g = new Generic<string>();
    g.Field = "A string";
    //...
    Console.WriteLine("Generic.Field           = \"{0}\"", g.Field);
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
static void Main()
{
    Generics<String^>^ g = gcnew Generics<String^>();
    g->Field = "A string";
    //...
    Console::WriteLine("Generics.Field           = \"{0}\"", g->Field);
    Console::WriteLine("Generics.Field.GetType() = {0}", g->Field->GetType()->FullName);
}

Zpět na začátek

Terminologie obecných typů

Následující termíny jsou používány k popisu obecných typů v rozhraní .NET Framework:

  • Definice obecného typu je deklarace třídy, struktury nebo rozhraní, která funguje jako šablona se zástupnými symboly pro typy, které může obsahovat nebo použít. Například třída System.Collections.Generic.Dictionary<TKey, TValue> může obsahovat dva typy: klíče a hodnoty. Vzhledem k tomu, že definice obecného typu je pouze šablona, nelze vytvořit instance třídy, struktury nebo rozhraní, které je definicí obecného typu.

  • Parametry obecného typu nebo Typové parametry jsou zástupné symboly v definici obecného typu nebo metody. Obecný typ System.Collections.Generic.Dictionary<TKey, TValue> obsahuje dva typové parametry, TKey a TValue, které představují typy klíčů a hodnot.

  • Konstruovaný obecný typ nebo konstruovaný typ je výsledkem určení typů parametrů obecného typu v definici obecného typu.

  • Argument obecného typu je jakýkoli typ, který nahrazuje parametr obecného typu.

  • Obecný termín obecný typ zahrnuje konstruované typy i definice obecného typu.

  • Kovariance a kontravariance parametrů obecného typu umožňují používat konstruované obecné typy, jejichž typové argumenty jsou více odvozené (kovariance) nebo méně odvozené (kontravariance) než cílový konstruovaný typ. Kovariance a kontravariance jsou souhrnně označovány jako variance. Další informace naleznete v tématu Kovariance a kontravariance v obecných typech.

  • Omezení jsou meze aplikované na parametry obecných typů. Například může omezit typové parametry na typy, které implementují obecné rozhraní System.Collections.Generic.IComparer<T>, pro zaručení schopnosti seřadit instance daného typu. Můžete také typové parametry omezit na typy, které mají určitou základní třídu, které mají výchozí konstruktor nebo které jsou referenční či hodnotové typy. Uživatelé obecného typu nemohou nahradit typové argumenty, které nesplňují omezení.

  • Definice obecné metody je metoda se dvěma seznamy parametrů: seznam parametrů obecného typu a seznam formálních parametrů. Typové parametry se mohou objevit jako návratový typ nebo jako typy formálních parametrů, jak je ukázáno v následujícím kódu.

Function Generic(Of T)(ByVal arg As T) As T
    Dim temp As T = arg
    '...
    Return temp
End Function
T Generic<T>(T arg)
{
    T temp = arg;
    //...
    return temp;
}
generic<typename T>
T Generic(T arg)
{
    T temp = arg;
    //...
    return temp;
}

Obecné metody se mohou vyskytovat v obecných nebo neobecných typech. Je důležité si uvědomit, že metoda není obecná, jen protože patří k obecnému typu, nebo dokonce protože obsahuje formální parametry jejichž typy jsou obecné parametry nadřazeného typu. Metoda je obecná pouze v případě, že má svůj vlastní seznam typových parametrů. V následujícím kódu je obecná pouze metoda G.

Class A
    Function G(Of T)(ByVal arg As T) As T
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
Class Generic(Of T)
    Function M(ByVal arg As T) As T
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
class A
{
    T G<T>(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
class Generic<T>
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
ref class A
{
    generic<typename T>
    T G(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};
generic<typename T>
ref class Generic
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};

Zpět na začátek

Knihovna tříd a podpora jazyků

Rozhraní .NET Framework poskytuje celou řadu obecných kolekcí tříd v následujících oborech názvů:

Obecná rozhraní pro provádění porovnání rovnosti a řazení jsou obsaženy v oboru názvů System spolu s delegáty obecných typů pro obslužné rutiny událostí, převody a predikáty vyhledávání.

Podpora pro zkoumání obecných typů a metod byla přidána do oboru názvů System.Reflection, podpora pro vydání dynamického sestavení, které obsahuje obecné typy a metody do System.Reflection.Emit a podpora pro generování zdrojových diagramů zahrnující obecné typy do System.CodeDom.

modul CLR (Common Language Runtime) poskytuje nové operační kódy a předpony pro podporu obecných typů v jazyce MSIL (Microsoft Intermediate Language), včetně Stelem, Ldelem, Unbox_Any, Constrained a Readonly.

Jazyky Visual C++, C# a Visual Basic poskytují úplnou podporu pro definování a použití obecných typů. Další informace o podpoře jazyka naleznete v tématech Generic Types in Visual Basic, Introduction to Generics (C# Programming Guide) a Overview of Generics in Visual C++.

Zpět na začátek

Vnořené typy a obecné typy

Typ, který je vnořen v obecném typu, může záviset na typových parametrech nadřazeného obecného typu. modul CLR (Common Language Runtime) považuje vnořené typy za obecné i v případě, že nemají vlastní parametry obecného typu. Při vytváření instance vnořeného typu, je nutné zadat typové argumenty pro všechny nadřazené obecné typy.

Zpět na začátek

Příbuzná témata

Title

Popis

Obecné kolekce v .NET Framework

Popisuje třídy obecných kolekcí a jiný obecné typy v rozhraní .NET Framework.

Obecní delegáti pro manipulaci s poli a seznamy

Popisuje obecné delegáty pro převody, predikáty vyhledávání a činnosti zaměřené na prvky pole nebo kolekce.

Obecná rozhraní

Popisuje obecná rozhraní, která zajišťují běžnou funkcionalitu napříč rodinami obecných typů.

Kovariance a kontravariance v obecných typech

Popisuje kovarianci a kontravarianci v parametrech obecného typu.

Výhody a omezení obecných typů

Shrnuje výhody a omezení při používání obecných typů.

Běžně používané typy kolekce

Obsahuje souhrn informací o vlastnostech a scénářích využití typů kolekcí v rozhraní .NET Framework, včetně obecných typů.

Kdy použít obecné kolekce

Popisuje obecná pravidla pro určení, kdy použít obecné typy kolekcí.

How to: Define a Generic Type with Reflection Emit

Vysvětluje jak vygenerovat dynamická sestavení, která zahrnují obecné typy a metody.

Generic Types in Visual Basic

Popisuje vlastnosti obecných typů pro uživatele jazyka Visual Basic, včetně témat s postupy pro použití a definování obecných typů.

Introduction to Generics (C# Programming Guide)

Obsahuje přehled o definování a použití obecných typů pro uživatele jazyka C#.

Overview of Generics in Visual C++

Popisuje vlastnosti obecných typů pro uživatele jazyka C++, včetně rozdílů mezi obecnými typy a šablonami.

Zpět na začátek

Odkaz

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes

Zpět na začátek