30 Kasım 2011 Çarşamba 8 yorum

IEnumerable Nedir

Visual Studio içerisinde bir takım yaralı interfaceler(ara yüzler) yer almakta. Bunlardan bir tanesi de IEnumerable ara yüzü.

IEnumerable, çalışma mantığını pek merak etmediğimiz, fakat sıklıkla kullandığımız “foreach” döngüsünü kullanmamıza sağlamakta.

Array, List, ArrayList, Hashtable vb. birçok koleksiyon IEnumerable sınıfını implement etmiştir. Bu sayede, foreach döngüsünü kullanarak bu koleksiyondaki elemanlara ulaşabilmekteyiz.

Bu ara yüzü biraz daha iyi tanımak için foreach yapısını incelemek gerekiyor. Foreach döngüsünün arka planında while döngüsü yatmakta. Yani run-time anında foreach yapısı while döngüsüne dönmekte. Döngünün ilerleyip; dizideki diğer elemanlara erişebilmesi içinde IEnumerable dan “GetEnumerator” metodu ile IEnumerator sınıfını talep etmekte.

IEnumerator ara yüzü 3 adet metot içermekte, bunlar: MoveNext, Current ve Reset metotlarıdır.

MoveNext metodu; dizideki bir sonraki elemana erişmemize sağlar.

Current metodu; dizinin o anki indeksindeki değeri getirir.

Reset metodu; dizinin indeksini -1’e çeker.

Bu yapıya örnek vermek gerekirse;

Yukarıdaki kodda dizi elemanlarını listbox’a atılmıştır. Foreach döngüsü çalışma anında hemen altındaki while döngüsüne dönüşmüştür.

Konuyu biraz anlamamız için kendi sınıfımızı yaratıp, foreach döngüsünü kullanmaya çalışalım. Ben “Liste” adlı bir sınıf oluşturdum ve bu sınıftan instance alıp foreach yapısında kullanmaya çalıştım.

Kodu derlediğimde Visual Studio hata verdi. Sebebi ise Liste sınıfının “GetEnumerator” metoduna sahip olmaması. YANİ LISTE SINIFININ FOREACH YAPISINI DESTEKLEMEDİĞİ HATASI.

Desteklemesi için sınıfımızın IEnumerable sınıfından türemesi gerekmete.

IEnumerable ara yüzü, “System.Collections” referansında yer almakta. Ara yüzü sınıfımıza iplement ettikten sonra otomatik olarak Studio; IEnumerator tipinde “GetEnumerator” metodunu oluşturmakta.

Foreach yapısı,bizden dizimizin ilerleyip diğer elemanlara ulaşmamız içinIEnumerable’dan IEnumerator sınıfından türemiş bir sınıf istemekte. Ben bunun için “Gezici” adlı bir sınıf yaratıp, IEnumerator ara yüzünü implement ettim.

İmplement ettikten sonra, Visual Studio otomatik olarak 3 tane metot oluşturdu. Bunlar MoveNext, Current ve Reset metotları.

3 metodu yukarıdaki gibi değiştirdikten sonra, Form_Load eventinde aşağıdaki kodları uyguluyoruz:

Uygulamayı çalıştırdığımızda;

Görüldüğü gibi uygulamamızda hata almadık, Sınıfımızı IEnumerable sınıfından türettik ve IEnumerator sınıfı ile de döngümüz de ilerleyip verileri gösterdik.

Umarım faydalı bir yazı olmuştur.
1 Kasım 2011 Salı 0 yorum

Constructor(Yapıcı) Metot

Önceki yazımda bir Futbolcu sınıfı yaratıp, Futbolcu sınıfına ait gerekli alanlar(field) ve metotlar tanımlamıştık, sonra Form1_Load kısmında Futbolcu sınıfına ait bir nesne üretip, tüm alanlara gerekli değerleri girmiştik.

Bu seferki senaryomuz da şöyle olsun, Form1_Load kısmına yine bir futbolcu nesnesi tanımlayalım, fakat oynamış olduğu maç sayısı alanına ulaşmayı unutalım. Peki, bu unutma bize pahalıya mal olabilir mi?

Evet olur, görüldüğü gibi maç başı istatistikleri hesaplanamadı. Çünkü maç sayısı alanına sıfır değeri yüklenmiş. Fakat biz o alana değer girmemiştik, nasıl sıfır alabildi ki? Sebep “Default Constructor”.

Default Constructor Nedir?

Biz bir sınıfa ait bir nesne ürettiğimizde kod tarafında yazmasak da otomatik olarak bir metot çalışır. Bu metotlara Default Constructor denmekte.

Constructor metotların ismi; sınıf ismi ile aynı, erişim düzenleyicisi de “public” olmalıdır. Eğer erişim düzenleyicisi “private” olursa, yaratacağımız nesne sınıfa erişemez ve hata oluşur.

Yukarıdaki gibi bir Default Constructor tanımlanırsa, her Futbolcu sınıfına ait bir nesne oluştuğunda, maç sayısı alanına otomatik olarak 10000 değeri yüklenmekte.

Constructor metotlar da “return” olmaz. Yukarıdaki gibi parametresi olmayan Constructor metotlara: Default Constructor Metot denmekte. Default Constructor sayesinde Herhangi bir sınıfa ait bir nesne oluştuğu anda, o sınıfa ait alanlara otomatik olarak bir takım değerler yüklenmekte. Örnek olarak Int tipindeki alanlara Constructor metot içerisinde bir değer atamadıysanız; otomatik olarak sıfır, bool tipindeki alanlara bir değer tanımlamadıysanız, otomatik olarak false değeri yüklenmekte.

Constructor metotlar “overloading” yapısını desteklemekte. Bu şekilde birçok Constructor yaratılabilmekte.

Bu Constructor metotlardan birine şu şekilde ulaşabiliriz:

Yukarıdaki resimde de görüldüğü gibi, Default Constructor ile birlikte 3 tip Constructor metot yapısının mevcut olduğunu görünmekte. Ben üçüncü Constructor metodu seçip, Futbolcu sınıfına ait nesne oluştururken, futbolcu sınıfa ait bir takım alanlara değeler girdim.

Constructor metot kullanımının en önemli sebeplerden biride, kullanıcıya zorunlu bir takım değerlere girmeyi zorlamak. Mesela tek bir Constructor Metot oluşturalım:

Futbolcu sınıfına ait bir nesne üretmeye çalışalım:

Görüldüğü gibi, nesneyi yaratırken bizden bazı değerleri girmeyi zorlamakta, bu şekilde unutulabilecek alanları Constructor içinde tanımlayabilmekteyiz.

Umarım faydalı bir yazı olmuştur. Diğer yazımda görüşmek üzere.
 
;