Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# – Custom Collection Initializers(Özel Koleksiyon İlklendiricileri)

Merhaba,

Önceki yazılarımda IEnumerable ve IEnumerator interface’leri ile özel koleksiyon yapısının nasıl oluşturulduğuna değinmiştik.(İlgili makale : C#’ta IEnumerable ve IEnumerator Interfaceleri Nedir? ve Nasıl Kullanılır?) Bu içeriğimizde ise oluşturduğumuz özel bir koleksiyonda initializers(ilklendirici/ön değer) özelliğinin nasıl yapılandırıldığı üzerine konuşuyor olacağız.

Öncelikle yukarıda vermiş olduğum adreste bahsedildiği gibi IEnumerable ve IEnumerator interfaceleri ile örnek bir koleksiyon yapısı oluşturalım.

    struct Koordinat
    {
        public int x { get; set; }
        public int y { get; set; }
        public int z { get; set; }
        public bool Durum { get; set; }
    }
    class Koordinatlar : IEnumerable<Koordinat>
    {
        readonly List<Koordinat> KoordinatListesi = new List<Koordinat>();
        public IEnumerator<Koordinat> GetEnumerator() => KoordinatListesi.GetEnumerator();
        IEnumerator IEnumerable.GetEnumerator() => KoordinatListesi.GetEnumerator();
    }

Oluşturmuş olduğumuz “Koordinatlar” sınıfı IEnumerable koleksiyonu aracılığıyla itere edilebilir hale getirilmiştir. Haliyle foreach döngüsüyle bu sınıfın nesnesi üzerinde rahat bir şekilde dönebiliriz. Amma velakin bu tarz detaylara önceki makalede değindiğimiz için hiç girmiyorum.

“Koordinatlar” sınıfı üzerinde aşağıdaki gibi ilklendirici çalıştırmak istiyoruz,

            Koordinatlar koordinatlar = new Koordinatlar
            {
                new Koordinat { x = 1, y = 3, z = 5, Durum = true },
                new Koordinat { x = 2, y = 4, z = 6, Durum = false  }
            };

Ama bu işlemi yaptığımızda aşağıdaki ekran görüntüsünde olduğu gibi hatayla karşılaşıyoruz.
C# - Custom Collection Initializers(Özel Koleksiyon İlklendiriciler)

Alınan hatanın metinsel halini aşağıya alırsak eğer,

Severity Code Description Project File Line Suppression State
Error CS1061 ‘Koordinatlar’ does not contain a definition for ‘Add’ and no extension method ‘Add’ accepting a first argument of type ‘Koordinatlar’ could be found (are you missing a using directive or an assembly reference?)

görüldüğü üzere ilgili sınıf içerisinde “Add” isminde bir argümanın bulunmadığını söylemekte ve hatanın bu eksiklikten kaynaklandığını belirtmektedir.

Hemen “Koordinatlar” sınıfımızın içerisine “Add” metodunu ekleyelim.

    class Koordinatlar : IEnumerable<Koordinat>
    {
        public void Add(Koordinat k) => KoordinatListesi.Add(k);
        readonly List<Koordinat> KoordinatListesi = new List<Koordinat>();
        public IEnumerator<Koordinat> GetEnumerator() => KoordinatListesi.GetEnumerator();
        IEnumerator IEnumerable.GetEnumerator() => KoordinatListesi.GetEnumerator();
    }

İlgili metodu ekledikten sonra ilklendiricimize göz atarsak eğer hatamızın ortadan kalktığını göreceğiz.
C# - Custom Collection Initializers(Özel Koleksiyon İlklendiriciler)

Burada yapmış olduğumuz işlemler neticesinde mekanizmanın nasıl çalıştığını anladığınızı düşünüyorum. İlklendirici, arkaplanda ilgili sınıfın “Add” metodunu tetiklemekte ve girilen değeri parametreyle yakayarak işleme tabi tutmaktadır.

Burada bilmeniz gereken bir diğer husus ise ilklendiricide belirtilen her bir virgülün(,) tek başına “Add” metodunu temsil etmesidir. Peki bu ne demektir?

“Add” metodunun overloadını oluşturalım.

    class Koordinatlar : IEnumerable<Koordinat>
    {
        public void Add(Koordinat k) => KoordinatListesi.Add(k);
        public void Add(int x, int y, int z, bool Durum) => KoordinatListesi.Add(new Koordinat { x = x, y = y, z = z, Durum = Durum });
        ...
        ...
        ...
    }

Şimdide “Koordinatlar” sınıfından tekrardan bir nesne oluşturup ilklendirici ile veri atayalım.

            Koordinatlar koordinatlar = new Koordinatlar
            {
                new Koordinat { x = 1, y = 3, z = 5, Durum = true },
                {2, 4, 6, false }
            };

Yukarıdaki kod bloğunu incelerseniz eğer, ilklendiricideki her bir virgülün “Add” metodunu ayrı ayrı çağırdığını hatta verilerin tipine göre “Add” metodunun ilgili overload’ını çağırdığını görmekteyiz.

Bu makalemizde de özel olarak oluşturduğumuz bir koleksiyon yapısına nasıl ilklendirici özelliği kazandırıldığını irdelemiş olduk.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 28 Mart 2017

    […] önceki kaleme almış olduğum C# – Custom Collection Initializers(Özel Koleksiyon İlklendiricileri) başlıklı makalemde Custom Collection Initializers yapılarının nasıl oluşturulduğuna […]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir