C# Generic Kolleksiyon Sınıfları



Bu yazımızda C# 2.0 ile birlikte C# diline eklenen Generic yapıları kullanılarak geliştirilmiş olan bazı koleksiyon tabanlı nesneleri ve generic yapıların avantajlarına bakacağız.

ArrayList liste = new ArrayList();
liste.Add(5);
liste.Add("generic");

Örneğimizde System.Collection isim alanından türeyen ArrayList sınıfını kullanarak liste adında bir kolleksiyon tanımladık ve bu kolleksiyona int tipinde 5 ve string tipinde "generic" değerlerini ekledik. Görüldüğü gibi iki farklı tür olmasına rağmen ArrayList'e bu iki değeri atayabildik. Çünkü ArrayList değerleri obje tipinde depo eder bu yüzden istediğimiz kadar farklı türü Add metodu ile ekleyebiliriz.

int a = (int)liste[0];
string b = (string)liste[1];
Ama kolleksiyondan bu değerleri çekip bir değişkene atamak istiyorsak bir casting işlemi yapmak gerekmektedir. Yani obje veri türünü int veri türüne çevirmemiz gerekmektedir. Buna C#'ta boxing işlemi denmektedir. Referans tipi olan obje ile değer tipi olan int belleğin farklı bölümlerinde bulunmaktadır. Bu yüzden bu işlem bizim için büyük bir performans kaybıdır. Generic kolleksiyon sınıfları bu soruna yanıt getirmiştir.

List<string> liste = new List<string>();
liste.Add("safak");
liste.Add("unel");

Örneğimizde yine liste tipinde bir koleksiyon tanımladık ama bu sefer bu koleksiyon System.Collections.Generic isim alanı altından tanımlandı. Yani generic bir koleksiyondur. Kolayca görüleceği gibi generic koleksiyonların farkı tanımladığımızda hangi tür nesneler içereceğini vermemizdir. Örneğimizdeki liste koleksiyonu string tipinde nesneler tutan bir koleksiyondur çünkü koleksiyonumuzu tanımlarken büyük küçük işaretleri arasına yazdığımız string bize bu koleksiyonun sadece string tipinde nesneler tutacağını belirtir. Şimdi bu koleksiyondan çektiğimiz bir nesneyi nasıl bir değişkene atıyoruz ona bakalım.


C# Generic Kolleksiyon Sınıfları,generic,kolleksiyonlar

Resimde görüldüğü gibi string tipindeki a değişkenine listenin herhangi bir değerini atamak istediğimizde karşımıza çıkan ToolTip bize listenin string tipinde bir değer döndürdüğünü söylüyor. Bu durumda artık bizim ilk örneğimizdeki ArrayList'te olduğu gibi bir casting yapmamıza gerek yok. Yani:

string a = liste[0];

dememiz bizim liste koleksiyonumuzun 0. indeksindeki değeri a değişkenine atamamız için yeterli. Casting'e gerek yok çünkü liste koleksiyonumuzun string tipinde bir değer döndüreceğiniz biliyoruz. Bu şekilde unboxing yapmadığımız yani objeyi stringe çevirmeye çalışmadığımız için herhangi bir performans kaybıda yaşamayız. Generic kolleksiyonların hayatımızı kolaylarştıran en önemli özelliğide budur..

Dictionary Kollesiyonunun Kullanımı:

C# Koleksiyonlar(System.Collection) yazımda bahsettiğim HashTable'ın generic halidir. Örnek bir HashTable tanımı yaparsak:

Hashtable hashTable= new Hashtable();
hashTable.Add("5", "unel");
hashTable.Add("4", "blog");
hashTable.Add("1", true);
hashTable.Add("3", "safak");
hashTable.Add("2", "2");
hashTable.Add("6", 123);
Görüldüğü gibi HashTable kollesiyonu hem string hem boolean hemde int türünden nesneleri ayni anda tutmaktadır. Çünkü generic olmadığı için tüm bu nesneleri obje olarak saklamaktadır. Dictionary kollesiyonuda ayni HashTable gibi key/value ikili matığıyla çalışmaktadır fakat generic olduğu için key ve value parametrelerinin hangi değer tipi olcağı tanımlama yapılırken verilmektedir. Bir örnek verecek olursak :

C# Generic Kolleksiyon Sınıfları,generic,kolleksiyonlar,Dictionary kullanımı
görüldüğü gibi tanımlamaların ardından artık yeni bir değer eklerken ToolTip bize key değerinin int tipinde , value değerinin ise string tipinde olacağını söylemektedir. Tanımlama :

            Dictionary<int, string> genericDictionary = new Dictionary<int, string>();
            genericDictionary.Add(0, "safak");
            genericDictionary.Add(1, "unel");

genericDictionary isminde tanımladığımız Dictionary kolleksiyonumuza tanımlama esnasında key değerinin int, value değerinin ise string tipinde olacağını büyük küçük işaretleri arasına yazarak belirtmiş olduk. Yani bundan sonra genericDictionary'a yeni bir değer eklerken key değerini int, value değerini ise string tipinde vermek zorundayız. Bu şekilde genericDictionary'dan bir değer çekersek dönecek value değerinin string tipinde olacağını biliriz ve casting işlemi yapmadan yani herhangi bir performans kaybına uğramadan bu koleksiyon üzerinden istediğimiz herhangi bir değeri string tipinde bir değişkene atayabiliriz.

Kısaca Generic kolleksiyon yapılarının özellikleri ve yararları bunlar umarım generic kolleksiyonlar bize ne kadar yararlı olduysa bu yazıda size o kadar yararlı olmuştur. Hoşçakalın..


5 yorum :

  1. Arraylistleri Generic olarak cast edilebildigini biliyor musun :) Bence super bi olay ;)

    YanıtlaSil
  2. Hmm bunu bilmiyordum ama zaten performans kaybına sebep olan olay casting yapılması ama öğrenmeden bişi demiyorum çok sağol bu bilgi için..

    YanıtlaSil
  3. teknik terimlere boğmadan ne işe yaradığını anlatarak yazmışsınız. elinize sağlık.

    YanıtlaSil