Generic tipler .Net 2.0 ile birlikte gelen yeniliklerden birisidir. Generic tipte yapılan bir tanımlama, bu tipin hangi tipler ile çalışabileceğini belirlemeye olanak sağlamaktadır. .Net platformunda generic tiplere örnek olarak List<T>, Nullable<T>, Dictionary<T,K> gibi tipleri verebiliriz. Bu tipler System.Collections.Generic ad uzayında barınmaktadır. Bunun yanında kendi generic tiplerimizi tanımlamak da mümkündür.
Neden Generic Tipleri Kullanmalıyız
Generic tipleri kullanmamızın en temel sebeplerinden biri, nesnelerin Object türüne dönüştürülmesi(casting işlemi) veya Object türündeki nesnelerin istenen tipe çevrilmesi sorunudur. Yani generic kullanımlar sayesinde tip dönüştürme sorununu ortadan kaldırmaktır. Generic tiplerin iki önemli avantajı bulunmaktadır.
- Runtime(Çalışma zamanı) Hataları: Object tip dönüşütürme işlemi sırasında oluşabilecek hataları derleyici anlayamamaktadır. Örneğin string tipindeki bir değişkeni object tipine dönüştürdüğümüzü varsayalım, daha sonra da bu object türünü int tipine dönüştürmeye çalıştığımızda derleme sırasında bir hata oluşmayacaktır. Ancak runtime esnasında bir hata oluşacaktır. Generic tiplerin kullanılması ise bu hataların derleme sırasında yakalanarak müdahale edilmesini sağlamaktadır. Ayrıca oluşturulan generic tiplerin hangi tipler ile çalışabileceğini de sınırlayabilmekteyiz.
- Performans etkisi: Tip dönüştürme işlemleri işlemcinin zamanını almakta ve performansı olumsuz etkilemektedir. Generic tiplerde ise böyle bir durum söz konusu değildir. Çalışılacak türler başlangıçta belirlendiği için tip dönüşümüne gerek kalmamaktadır.
Örnek:
class ObjectTest { public object T; public object K; public ObjectTest(object t, object k) { T = t; K = k; } } class GenericTest<T,K> { public T t; public K k; public GenericTest(T t, K k) { this.t = t; this.k = k; } }
Yukardaki örnekte ObjectTest sınıfı tip dönüşümlerini gerektirecek bir türü temsil etmekte, GenericTest sınıfı ise kullanılacak tip dönüşümüne gerek duymuyor. Bunu şu şekilde ispatlayabilirsiz.
static void Main(string[] args) { ObjectTest obTest = new ObjectTest("Merhaba ", "dünya"); Console.WriteLine((string)obTest.T + (string)obTest.K); GenericTest<string, string> genTest = new GenericTest<string, string>("Merhaba ", "dünya"); Console.WriteLine(genTest.t+ genTest.k); }
Yukarıda sınıfların kullanımı sırasında generic tip örneği başlangıçta iki adet string tipi ile çalışacağını belirlemeye izin veriyor. Bu yüzden tip dönüşümüne gerek kalmıyor.
Umarım faydalı bir yazı olmuştur.
Bu yazıyla ilgili çalışan bir uygulamanın kodlarını buradan bulabilirsiniz.