30 Ekim 2013 Çarşamba

C# ArrayList Sınıfının Kullanımı

Arraylist, içerisinde object tipinden nesneler tutabilen bir tiptir. Çalışma mantığını ise encapsulation felsefesi ile özdeşleştirebiliriz. Çünkü arka tarafta bir object dizisi oluşturur ve işlemleri bu dizi üzerinden yapar. Yani “ArrayList, bir object dizisini kapsüllemiştir” dersek doğru bir cümle kurmuş oluruz. .Net’deki tüm tiplerin  object’den kalıtıldığını düşünürsek, ArrayList’in içerisinde object tutması ile bizim için çok esnek bir yapı sağladığını düşünebiliriz. Ancak bu durumun 2 önemli dezavantajı da mevcuttur. İçerisine eklemek istediğimiz eleman değer türlü bir tipse, boxing olayı meydana gelecektir çünkü içerisine eklenen eleman object olarak tutulur. Bu da performans açısından pek tercih edilen bir durum değildir. Diğer bir dezavantajı ise, okuma veya yapacağımız zaman cast işlemi yapmamız gerektiğidir. Yine aynı mantık ile, içeride object tipinden nesneler tutulduğundan ötürü doğru tipe cast etme işlemi programcıya düşer. Kullanımına basit bir örnek vermeye çalışalım.

class Program
    {
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();
            arrayList.Add(new object());
            arrayList.Add(10);
            arrayList.Add(3.14);
            arrayList.Add("metinsel ifade");
            arrayList.Add(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 });
            arrayList.Add(new SqlConnection());
            arrayList.Add('c');

            Console.WriteLine(arrayList.Count); // ekran çıktısı => 7

            ////////////////////////////////////////////////////////////////

            int[] sayilar = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            ArrayList liste = new ArrayList();

            foreach (int sayi in sayilar)
            {
                liste.Add(sayi); // her ekleme sırasında boxing olayı meydana gelecektir.
            }

            //liste.AddRange(sayilar);
            //diziler Array tipinden kalıtılır. Array tipi de ICollection interface'ini implement ettiğinden ötürü AddRange metoduna parametre olarak verebiliriz. Yukarıdaki döngü yerine direkt bu işlemi yapabiliriz.

            int[] yeniDizi = new int[sayilar.Length];

            for (int i = 0; i < yeniDizi.Length; i++)
            {
                yeniDizi[i] = (int)liste[i]; //listenin içerisindeki her bir eleman object olduğundan cast işlemi yapmak zorundayız. Unboxing olayı meydana gelir.
            }
        }
    }

ArrayList’in kullanımı en basit anlamda yukarıdaki gibidir. Generic mimari ile birlikte gelen List<> koleksiyonu, yukarıda saydığımız dezavantajları ortadan kaldırmaktadır.  Örneğin giriş kısmında eklediğimiz SqlConnection, char, string vb türler sadece örnek vermek amacı ile yazılmıştır. Zaten çoğu durumda bir koleksiyon içersinde aynı tipten nesneler tutarız. Bu yüzden ArrayList kullanmak pek hoş olmayacaktır.

Hiç yorum yok:

Yorum Gönder