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