Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Genel değerler, bir yöntemi, sınıfı, yapıyı veya arabirimi, üzerinde işlem yapılan hassas veri türüne göre uyarlamanıza olanak sağlar. Örneğin, anahtarların ve değerlerin herhangi bir türde olmasını sağlayan Hashtable sınıfını kullanmak yerine Dictionary<TKey,TValue> genel sınıfını kullanabilir ve anahtar ile değer için izin verilen türleri belirtebilirsiniz. Genel türlerin avantajları arasında artan kod yeniden kullanılabilirliği ve tür güvenliği yer alı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 koleksiyon sınıfı, depolayan nesne türü için yer tutucu olarak 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, tür parametresini dönüş değerinin türü olarak veya resmi parametrelerinden birinin türü olarak kullanabilir.
Aşağıdaki kod basit bir genel sınıf tanımını gösterir.
public class SimpleGenericClass<T>
{
public T Field;
}
Public Class SimpleGenericClass(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.
public static void Main()
{
SimpleGenericClass<string> g = new SimpleGenericClass<string>();
g.Field = "A string";
//...
Console.WriteLine($"SimpleGenericClass.Field = \"{g.Field}\"");
Console.WriteLine($"SimpleGenericClass.Field.GetType() = {g.Field.GetType().FullName}");
}
Public Shared Sub Main()
Dim g As New SimpleGenericClass(Of String)
g.Field = "A string"
'...
Console.WriteLine("SimpleGenericClass.Field = ""{0}""", g.Field)
Console.WriteLine("SimpleGenericClass.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
Terminoloji
.NET'te genel konuları tartışmak için aşağıdaki terimler kullanılır:
genel tür tanımı, içeriğinde kullanabileceği türler için yer tutucular barındıran bir şablon olarak işlev gören bir sınıf, yapı veya arabirim tanımıdır. Ö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. System.Collections.Generic.Dictionary<TKey,TValue> genel türü, anahtarlarının ve değerlerinin türlerini temsil eden
TKeyveTValueolmak üzere iki tür parametresine sahiptir.oluşturulmuş genel tür veya oluşturulmuş tür, genel tür tanımının genel tür parametrelerinin türlerini belirlemenin sonucudur.
Genel tür bağımsız değişkeni, bir genel tür parametresinin yerine geçen herhangi bir türdür.
Genel tür terimi hem yapıtlı 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, oluşturulmuş genel türleri kullanmanızı sağlar. Kovaryans ve kontravaryans topluca varyans olarak adlandırılır. Daha fazla bilgi için bkz. Kovaryans ve ters değişken.
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 System.Collections.Generic.IComparer<T> genel arabirimi uygulayan türlerle sınırlayabilirsiniz. Ayrıca tür parametrelerini, parametresiz bir oluşturucuya sahip olan veya başvuru türleri veya değer türleri olan belirli bir temel sınıfa sahip türlerle kısıtlayabilirsiniz. Genel türün 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ü olarak veya resmi parametrelerin türleri olarak görünebilir.
T MyGenericMethod<T>(T arg) { T temp = arg; //... return temp; }Function MyGenericMethod(Of T)(ByVal arg As T) As T Dim temp As T = arg '... Return temp End FunctionGenel yöntemler genel veya genel olmayan türlerde görünebilir. Bir yöntemin sadece genel bir türe ait olması veya türlerin kapsayıcı türün genel parametreleri olması nedeniyle 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
Ggeneldir.class A { T G<T>(T arg) { T temp = arg; //... return temp; } } class MyGenericClass<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 MyGenericClass(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 değerler, tür güvenliği yükünü sizden derleyiciye taşır. Doğru veri türü derleme zamanında kontrol edildiğinden test etmek için kod yazmanıza gerek yoktur. Tür dönüştürme gereksinimi ve çalışma zamanı hatası olasılığı azaltılır.
Daha az kod ve kod daha kolay yeniden kullanılır. Bir temel türden türetmeye ve üyeleri iptal etmeye gerek yoktur. Örneğin, LinkedList<T> hemen 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 = new LinkedList<string>();Dim llist As New LinkedList(Of String)()Daha iyi performans. Genel koleksiyon türleri genellikle değer türlerini depolamak ve düzenlemek 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, Predicate<T> genel temsilcisi belirli bir tür için kendi arama ölçütlerinizi uygulayan bir yöntem oluşturmanıza ve yönteminizi Array, Findve FindLastgibi FindAll türündeki yöntemlerle kullanmanıza olanak tanır.
Genel değerler dinamik olarak oluşturulan kodu kolaylaştırır. Genel değerleri 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, MarshalByRefObject gibi temel sınıfların çoğundan türetilebilir (ve kısıtlamalar bu genel tür parametrelerinin MarshalByRefObjectgibi temel sınıflardan türetilmesi için kullanılabilir). Ancak,.NET bağlama bağlı genel türleri desteklemez. Genel bir tür ContextBoundObjecttüretilebilir, ancak o türden bir örnek oluşturmaya çalışmak TypeLoadException'e neden olur.
Numaralandırmaların genel tür parametreleri olamaz. Numaralandırma, yalnızca tesadüfi olarak genel olabilir (örneğin, Visual Basic, C# veya C++ kullanılarak tanımlanan genel bir türün içinde yer alması nedeniyle). Daha fazla bilgi için bkz. Ortak Tür Sistemi'ndeki "Numaralandırmalar".
Hafif 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çinde tanımlanan iç içe bir türün örneği oluşturulamaz. Başka bir deyişle, yansıma bağlamında, bu diller kullanılarak tanımlanan iç içe bir tür, içerisinde yer aldığı tüm dış türlerin tür parametrelerini de içerir. 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, MakeGenericTypeiçindeki "İç İçe Türler" bölümüne bakın.
Uyarı
Dinamik bir derlemede kod yayılarak veya Ilasm.exe (IL Assembler) kullanılarak tanımlanan iç içe bir türün, kapsayan türlerine ait tür parametrelerini içermesi gerekmez; ancak, içermediği takdirde, bu tür parametreler iç içe sınıfın kapsamında olmaz.
Daha fazla bilgi için, MakeGenericTypeiçindeki "İç İçe Türler" bölümüne bakı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:
System.Collections.Generic ad alanı, .NET tarafından sağlanan List<T> ve Dictionary<TKey,TValue> genel sınıfları gibi genel koleksiyon türlerinin çoğunu içerir.
System.Collections.ObjectModel ad alanı, nesne modellerini sınıflarınızın kullanıcılarına göstermek için yararlı olan ReadOnlyCollection<T> genel sınıfı gibi ek genel koleksiyon türleri içerir.
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 System ad alanında sağlanır.
System.Numerics ad alanı, matematiksel işlevler için genel arabirimler sağlar (.NET 7 ve sonraki sürümlerde kullanılabilir). Daha fazla bilgi için bkz. Genel matematik.
Genel türleri ve genel yöntemleri incelemek için System.Reflection ad alanına, genel türler ve yöntemleri içeren dinamik derlemeleri yaymak için System.Reflection.Emit'e ve genel içeren kaynak grafikleri oluşturmak için System.CodeDom'ye destek eklenmiştir.
Ortak dil çalışma zamanı, Stelem, Ldelem, Unbox_Any, Constrainedve Readonlygibi ortak ara dildeki (CIL) genel türleri desteklemek için yeni işlem kodları ve ön ekleri sağlar.
Visual C++, C# ve Visual Basic'in tümü genel öğeleri tanımlamak ve kullanmak için tam destek sağlar. Dil desteği hakkında daha fazla bilgi için bkz. Visual Basic'te Genel Türler, Genel Türler'e Giriş ve Visual C++'da Genel Türler'e Genel Bakış.
İç içe türler ve genel türler
Genel bir tür içinde yer alan bir alt tür, kapsayıcı genel türün tip parametrelerine bağlı olabilir. Ortak dil çalışma zamanı, kendi genel tür parametreleri olmasa bile iç içe türleri genel tür olarak değerlendirir. İç içe türün bir örneğini oluştururken, tüm kapsayan genel türler için tür bağımsız değişkenleri belirtmeniz gerekir.
İlgili makaleler
| Başlık | Açıklama |
|---|---|
| .NET'te Genel Koleksiyonlar | .NET'teki genel koleksiyon sınıflarını ve diğer genel türleri açıklar. |
| Dizileri ve Listeleri İşlemek için Genel Vekiller | Bir dizi veya koleksiyonun öğeleri üzerinde gerçekleştirilecek dönüştürmeler, arama önkoşulları ve eylemler için genel temsilcileri açıklar. |
| Genel matematik | Matematiksel işlemleri genel olarak nasıl gerçekleştirebileceğinizi 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 | .NET'teki koleksiyon türlerinin özellikleri ve kullanım senaryoları hakkında genel türler de dahil olmak üzere ö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'te 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ı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 Değerlere Genel Bakış | C++ kullanıcıları için jenerikler özelliğini açıklar, jenerikler ve şablonlar arasındaki farkları da içerecek şekilde. |