.NET içindeki Genel Türler

Genel değerler, bir yöntemi, sınıfı, yapıyı veya arabirimi, üzerinde işlem yaptığınız kesin veri türüne göre uyarlamanıza olanak sağlar. Örneğin, anahtarların ve değerlerin Hashtable herhangi bir türde olmasını sağlayan sınıfını kullanmak yerine, genel sınıfı kullanabilir Dictionary<TKey,TValue> ve anahtar ile değer için izin verilen türleri belirtebilirsiniz. Genel türlerin avantajları arasında kodun yeniden kullanılabilirliği ve tür güvenliği artırılır.

Genel Türleri Tanımlama ve Kullanma

Genel türler, depoladıkları veya kullandıkları türlerden biri veya daha fazlası için yer tutucuları (tür parametreleri) olan sınıflar, yapılar, arabirimler ve yöntemlerdir. Genel bir koleksiyon sınıfı, depolayan nesne türü için yer tutucu olarak bir tür parametresi kullanabilir; tür parametreleri, alanlarının türleri ve yöntemlerinin parametre türleri olarak görünür. Genel bir yöntem, dönüş değerinin türü veya resmi parametrelerinden birinin türü olarak tür parametresini kullanabilir. Aşağıdaki kod basit bir genel sınıf tanımını gösterir.

generic<typename T>
public ref class Generics
{
public:
    T Field;
};
public class Generic<T>
{
    public T Field;
}
Public Class Generic(Of T)
    Public Field As T

End Class

Genel bir sınıfın örneğini oluşturduğunuzda, tür parametreleri yerine kullanılacak gerçek türleri belirtirsiniz. Bu, tür parametrelerinin göründüğü her yerde seçtiğiniz türlerin yerini alan, oluşturulmuş genel sınıf olarak adlandırılan yeni bir genel sınıf oluşturur. Sonuç, aşağıdaki kodda gösterildiği gibi, seçtiğiniz türlere göre uyarlanmış, tür açısından güvenli bir sınıftır.

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

Genel terimler terminolojisi

.NET'te genel türleri tartışmak için aşağıdaki terimler kullanılır:

  • Genel tür tanımı, içerebileceği veya kullanabileceği türler için yer tutucularla şablon olarak işlev gösteren bir sınıf, yapı veya arabirim bildirimidir. Örneğin, System.Collections.Generic.Dictionary<TKey,TValue> sınıfı iki tür içerebilir: anahtarlar ve değerler. Genel tür tanımı yalnızca bir şablon olduğundan, genel tür tanımı olan bir sınıfın, yapının veya arabirimin örneklerini oluşturamazsınız.

  • Genel tür parametreleri veya tür parametreleri, genel tür veya yöntem tanımındaki yer tutuculardır. Genel System.Collections.Generic.Dictionary<TKey,TValue> tür, TKey anahtarlarının ve TValuedeğerlerinin türlerini temsil eden ve olmak üzere iki tür parametresine sahiptir.

  • Bir genel tür veya yapı türü, genel tür tanımının genel tür parametreleri için türleri belirtmenin sonucudur.

  • Genel tür bağımsız değişkeni, genel tür parametresiyle değiştirilen herhangi bir türdür.

  • Genel terim genel türü hem yapılı türleri hem de genel tür tanımlarını içerir.

  • Genel tür parametrelerinin kovaryans ve kontravaryansı, tür bağımsız değişkenleri hedef türe göre daha fazla türetilmiş (kovaryans) veya daha az türetilmiş (kontravaryans) olan, yapılı genel türler kullanmanızı sağlar. Kovaryans ve kontravaryans topluca varyans olarak adlandırılır. Daha fazla bilgi için bkz . Kovaryans ve Kontravaryans.

  • Kısıtlamalar , genel tür parametrelerine yerleştirilen sınırlardır. Örneğin, tür örneklerinin sıralanabilir olduğundan emin olmak için tür parametresini genel arabirimi uygulayan System.Collections.Generic.IComparer<T> türlerle sınırlayabilirsiniz. Ayrıca, tür parametrelerini belirli bir temel sınıfa sahip, parametresiz bir oluşturucuya sahip olan ya da başvuru türleri ya da değer türleri olan türlerle kısıtlayabilirsiniz. Genel tür kullanıcıları, kısıtlamaları karşılamayan tür bağımsız değişkenlerini değiştiremez.

  • Genel yöntem tanımı, iki parametre listesi içeren bir yöntemdir: genel tür parametrelerinin listesi ve resmi parametrelerin listesi. Tür parametreleri, aşağıdaki kodda gösterildiği gibi dönüş türü veya resmi parametrelerin türleri olarak görünebilir.

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

Genel yöntemler genel veya genel olmayan türlerde görünebilir. Bir yöntemin yalnızca genel bir türe ait olduğu için veya türleri kapsayan türün genel parametreleri olan resmi parametreleri olduğu için genel olmadığını unutmayın. Bir yöntem yalnızca kendi tür parametreleri listesine sahipse geneldir. Aşağıdaki kodda yalnızca yöntem G geneldir.

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;
    }
};
class A
{
    T G<T>(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
class Generic<T>
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
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

Genel türlerin avantajları ve dezavantajları

Genel koleksiyonları ve temsilcileri kullanmanın birçok avantajı vardır:

  • Tür güvenliği. Genel tür güvenliği yükünü sizden derleyiciye taşır. Derleme zamanında zorlandığından, doğru veri türünü test etmek için kod yazmanız gerekmez. Tür atama gereksinimi ve çalışma zamanı hataları olasılığı azalır.

  • Daha az kod ve kod daha kolay yeniden kullanılır. Bir temel türden devralma ve üyeleri geçersiz kılmaya gerek yoktur. Örneğin, anında LinkedList<T> kullanıma hazırdır. Örneğin, aşağıdaki değişken bildirimiyle bağlantılı bir dize listesi oluşturabilirsiniz:

    LinkedList<String^>^ llist = gcnew LinkedList<String^>();
    
    LinkedList<string> llist = new LinkedList<string>();
    
    Dim llist As New LinkedList(Of String)()
    
  • Daha iyi performans. Genel koleksiyon türleri genellikle değer türlerini depolamak ve işlemek için daha iyi performans gösterir çünkü değer türlerini kutulamanız gerekmez.

  • Genel temsilciler, birden çok temsilci sınıfı oluşturmaya gerek kalmadan tür açısından güvenli geri çağırmaları etkinleştirir. Örneğin, genel temsilci belirli Predicate<T> bir tür için kendi arama ölçütlerinizi uygulayan bir yöntem oluşturmanıza ve yönteminizi , FindLast, ve FindAllgibi Findyöntemlerle Array kullanmanıza olanak tanır.

  • Genel değerler dinamik olarak oluşturulan kodu kolaylaştırır. Genel türleri dinamik olarak oluşturulan kodla kullandığınızda türü oluşturmanız gerekmez. Bu, tüm derlemeleri oluşturmak yerine basit dinamik yöntemleri kullanabileceğiniz senaryoların sayısını artırır. Daha fazla bilgi için bkz . Nasıl yapılır: Dinamik Yöntemleri Tanımlama ve Yürütme ve DynamicMethod.

Genel türlerin bazı sınırlamaları şunlardır:

  • Genel türler gibi MarshalByRefObject çoğu temel sınıftan türetilebilir (ve gibi genel tür parametrelerinin gibi MarshalByRefObjecttemel sınıflardan türetilmesi için kısıtlamalar kullanılabilir). Ancak,.NET bağlama bağlı genel türleri desteklemez. Genel bir tür' den ContextBoundObjecttüretilebilir, ancak bu türün bir örneğini oluşturmaya çalışmak bir TypeLoadExceptionneden olur.

  • Sabit listeleri genel tür parametrelerine sahip olamaz. Numaralandırma yalnızca olaysal olarak genel olabilir (örneğin, Visual Basic, C# veya C++kullanılarak tanımlanan genel bir türe iç içe yerleştirilmiş olduğundan). Daha fazla bilgi için bkz. Ortak Tür Sistemi'ndeki "Numaralandırmalar".

  • Basit dinamik yöntemler genel olamaz.

  • Visual Basic, C#ve C++'da, tüm kapsayan türlerin tür parametrelerine türler atanmadığı sürece genel bir tür içine alınmış iç içe türün örneği oluşturulamaz. Bunu söylemenin bir diğer yolu da yansımada, bu diller kullanılarak tanımlanan iç içe bir türün tüm kapsayan türlerinin tür parametrelerini içermesidir. Bu, kapsayan türlerin tür parametrelerinin iç içe türün üye tanımlarında kullanılmasını sağlar. Daha fazla bilgi için, içinde "İç İçe Türler" bölümüne MakeGenericTypebakın.

    Not

    Dinamik bir derlemede kod yayılarak veya Ilasm.exe (IL Assembler) kullanılarak tanımlanan iç içe bir tür, kapsayan türlerinin tür parametrelerini eklemek için gerekli değildir; ancak, bunları içermiyorsa, tür parametreleri iç içe sınıfın kapsamında değildir.

    Daha fazla bilgi için, içinde "İç İçe Türler" bölümüne MakeGenericTypebakın.

Sınıf Kitaplığı ve Dil Desteği

.NET, aşağıdaki ad alanında bir dizi genel koleksiyon sınıfı sağlar:

Sıralama ve eşitlik karşılaştırmaları uygulamak için genel arabirimler, olay işleyicileri, dönüştürmeler ve arama önkoşulları için genel temsilci türleriyle birlikte ad alanında sağlanır System .

Genel türlerin ve genel yöntemlerin System.Reflection incelenmesi, System.Reflection.Emit genel türler ve yöntemler System.CodeDom içeren dinamik derlemelerin yayılması ve genel türler içeren kaynak grafiklerin oluşturulması için ad alanına genel türler için destek eklenmiştir.

Ortak dil çalışma zamanı, , Ldelem, ConstrainedUnbox_Any, ve gibi StelemMicrosoft ara dilinde (MSIL) genel türleri desteklemek için yeni opcode'lar ve Readonlyön ekler sağlar.

Visual C++, C# ve Visual Basic genel türleri tanımlama ve kullanma için tam destek sağlar. Dil desteği hakkında daha fazla bilgi için bkz. Visual Basic'de Genel Türler, Genel Türlere Giriş ve Visual C++'da Genel Türler'e Genel Bakış.

İç İçe Türler ve Genel Türler

Genel bir türe iç içe yerleştirilmiş bir tür, kapsayan genel türün tür parametrelerine bağlı olabilir. Ortak dil çalışma zamanı, kendi genel tür parametreleri olmasa bile iç içe türleri genel olarak kabul eder. İç içe türün bir örneğini oluşturduğunuzda, tüm kapsayan genel türler için tür bağımsız değişkenleri belirtmeniz gerekir.

Başlık Açıklama
.NET'te Genel Koleksiyonlar .NET'te genel koleksiyon sınıflarını ve diğer genel türleri açıklar.
Dizileri ve Listeleri Düzenlemek için Genel Temsilciler Bir dizi veya koleksiyonun öğelerinde gerçekleştirilecek dönüştürmeler, arama önkoşulları ve eylemler için genel temsilcileri açıklar.
Genel Arabirimler Genel tür aileleri arasında ortak işlevsellik sağlayan genel arabirimleri açıklar.
Kovaryans ve Kontravaryans Genel tür parametrelerinde kovaryans ve kontravaryansı açıklar.
Yaygın Olarak Kullanılan Koleksiyon Türleri Genel türler de dahil olmak üzere .NET'teki koleksiyon türlerinin özellikleri ve kullanım senaryoları hakkında özet bilgiler sağlar.
Genel Koleksiyonlar Ne Zaman Kullanılır? Genel koleksiyon türlerinin ne zaman kullanılacağını belirlemek için genel kuralları açıklar.
Nasıl yapılır: Yansıma Yayma ile Genel Tür Tanımlama Genel türleri ve yöntemleri içeren dinamik derlemelerin nasıl oluşturulacağı açıklanır.
Visual Basic'da Genel Türler Genel türleri kullanmaya ve tanımlamaya yönelik nasıl yapılır konuları da dahil olmak üzere Visual Basic kullanıcıların genel türler özelliğini açıklar.
Genel Türlere Giriş C# kullanıcıları için genel türleri tanımlamaya ve kullanmaya genel bir bakış sağlar.
Visual C++'da Genel Türlere Genel Bakış C++ kullanıcıları için genel değerler ve şablonlar arasındaki farklar da dahil olmak üzere genel değerler özelliğini açıklar.

Başvuru

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes