C Sharp Programlama Dili/foreach döngüsünde kendi nesnelerimizi kullanma

Vikikitap, özgür kütüphane
Gezinti kısmına atla Arama kısmına atla

Bildiğiniz üzere foreach döngüsünün kuruluşu şöyleydi:

int[] dizi={1,2,3};
foreach(int i in dizi)
    Console.WriteLine(i);

Yukarıdaki koddaki i değişkenine foreach döngüsünün döneni, dizi değişkenine ise foreach döngüsünün döndüreni denir. Bu derste hem dönenin hem döndürenin kendi sınıf veya yapı nesnelerimiz olmasını sağlayacağız. Öncelikle döndürenin kendi nesnemiz olmasını sağlayalım.

using System;
using System.Collections;
class Koleksiyon:IEnumerable
{
    public int[] Dizi;
    public Koleksiyon(int[] dizi)
    {
        this.Dizi=dizi;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return new ENumaralandırma(this);
    }
}
class ENumaralandırma:IEnumerator
{
    int indeks;
    Koleksiyon koleksiyon;
    public ENumaralandırma(Koleksiyon koleksiyon)
    {
        this.koleksiyon=koleksiyon;
        indeks=-1;
    }
    public void Reset()
    {
        indeks=-1;
    }
    public bool MoveNext()
    {
        indeks++;
        if(indeks<koleksiyon.Dizi.Length)
            return true;
        else
            return false;
    }
    object IEnumerator.Current
    {
        get
        {
            return(koleksiyon.Dizi[indeks]);
        }
    }
}
class MainMetodu
{
    static void Main()
    {
        int[] dizi={1,2,3,8,6,9,7};
        Koleksiyon k=new Koleksiyon(dizi);
        foreach(int i in k)
            Console.Write(i+" ");
    }
}

Bir nesnenin foreach döngüsünde döndürülebilmesi için bu nesnenin sınıfının/yapısının System.Collections isim alanındaki IEnumerable arayüzünü uygulaması gerekir. Bu arayüz geri dönüş tipi IEnumerator olan ve parametre almayan GetEnumerator() metodunu içerir. IEnumerator yine System.Collections isim alanında bulunan bir arayüzdür. Bu metodun geriye bir IEnumerator nesnesi döndürebilmesi için bizim başka bir sınıfta IEnumerator arayüzünü uygulamamız ve bu metodun geriye bu sınıf türünden nesne döndürmesi gerekmektedir. IEnumerator arayüzü Reset() ve MoveNext() metotlarını ve Current sahte özelliğini içerir.

Bir nesne foreach döngüsünde döndüren konumuna koyulursa C# derleyicisi bu nesnenin GetEnumerator() metodunu çalıştırarak IEnumerator nesnesini elde eder. Bu nesnenin MoveNext() metodu döngüye girilmeden ve döngüde her bir iterasyondan sonra çalıştırılır ve sıradaki iterasyona girilip girilmeyeceğini döndürür. Current sahte özelliği foreach döngü bloğunun içinde dönen değişkenin ne döndüreceğini döndürür, sadece get bloğu olmalıdır, geri dönüş tipi object'tir. foreach döngüsünün parantezleri içine yazılan dönen tipine göre foreach döngü bloğunun içinde Current sahte özelliğinin döndürdüğü object nesneye unboxing yapılır. foreach döngüsünün her bir iterasyonunda dönenin farklı olmasını sağlayan şey MoveNext() metodudur. IEnumerator nesnesi döngünün hayatı boyunca bellekte kalır, döngüden çıkılınca bellekten silinir.

Şimdi dönenin kendi türümüz olmasını sağlayalım:

 using System;
 class A
 {
    public int Ozellik;
    public A(int a)
    {
       Ozellik=a;
    }
 }
 class Ana
 {
    static void Main()
    {
       A[] dizi=new A[3];
       dizi[0]=new A(10);
       dizi[1]=new A(20);
       dizi[2]=new A(50);
       foreach(A i in dizi)
          Console.WriteLine(i.Ozellik);
    }
 }

Gördüğünüz gibi kendi oluşturduğumuz sınıf türünden nesnelerle diziler oluşturabiliyoruz. Nasıl ki int[] ile int türündeki veriler bir araya geliyorsa bizim örneğimizde de A türünden nesneler bir araya geldi.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Partial (kısmi) tipler
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET