C Sharp Programlama Dili/İndeksleyiciler
Daha önceden de bildiğiniz gibi tanımladığımız diziler System.Array sınıfı türünden bir nesnedir. Bu sayede tanımladığımız diziler üzerinden System.Array sınıfının üye elemanlarına erişebiliriz. Örneğin System.Array sınıfına ait olan Length
özelliği dizimizin kaç elemandan oluştuğunu tutar. Sort()
metodu ise dizimizin elemanlarını sıralar. Hatırlarsanız dizilerin elemanlarına [] operatörüyle erişiyorduk. Yani Array sınıfı türünden bir nesnenin sonuna [] koyuyorduk ve bunun belirli bir anlamı vardı. Bunu sağlayan System.Array sınıfındaki bir indeksleyeciden başka bir şey değildir. Artık biz de Sinif türünden yarattığımız a nesnesini a[5]
şeklinde yazabileceğiz ve bunun belirli bir anlamı olacak. İndeksleyiciler tıpkı diziler gibi tek boyutlu indeksleyiciler ve çok boyutlu indeksleyiciler olmak üzere ikiye ayrılır.
Tek boyutlu indeksleyiciler
değiştirÖrnek:
using System;
class Sinif
{
public int Sayi;
public int this[int indeks]
{
get
{
return Sayi;
}
set
{
Sayi=value;
}
}
}
class AnaProgram
{
static void Main()
{
Sinif a=new Sinif();
a[5]=30;
Console.WriteLine(a[5]);
}
}
Gördüğünüz gibi indeksleyiciler sahte özelliklere oldukça benziyor. Ancak ciddi farkları da var. İndeksleyici tanımlarken parametre normal parantez yerine köşeli parantezler arasına yazılıyor. Esas programda [ ve ] arasına girilen veri indeksleyiciye parametre olarak gönderiliyor. İndeksleyicilere özel bir ad verilmiyor, bunun yerine this
anahtar sözcüğü kullanılıyor. Ayrıca şunu hatırlatmak isterim: a[5]=30;
satırıyla a[5]
'in değil a'nın Sayi özelliği değiştiriliyor. Yani esas programı şöyle değiştirsek:
class AnaProgram
{
static void Main()
{
Sinif a=new Sinif();
a[5]=30;
a[1]=2;
Console.WriteLine(a[5]);
Console.WriteLine(a[1]);
}
}
Bu programda ekrana alta alta iki kez 2 yazar. Çünkü hem a[5]=30;
hem de a[1]=2;
satırları a nesnesinin Sayi
özelliğini değiştirir. Şimdi programımızı şöyle değiştirelim:
using System;
class Sinif
{
public int Sayi;
public int this[int indeks]
{
get
{
return Sayi;
}
set
{
if(indeks>0)
Sayi+=value;
else if(indeks<0)
Sayi-=value;
else
Sayi=Sayi;
}
}
}
class AnaProgram
{
static void Main()
{
Sinif a=new Sinif();
a[5]=45;
a[-10]=23;
a[100]=87;
a[-80]=100;
Console.WriteLine(a[0]);
}
}
Bu program ekrana 9 yazar. İndeksleyicinin set blokunda indeksleyiciye hangi indeksle ulaşıldığı kontrol ediliyor. Eğer indeksleyici 0'dan büyükse esas programda o indeksleyiciye atanan değer a nesnesinin Sayi özelliğine ekleniyor. Eğer indeksleyici 0'dan küçükse esas programda o indeksleyiciye atanan değer a nesnesinin Sayi özelliğinden çıkarılıyor. Eğer indeksleyici 0'sa Sayi'nin değeri değiştirilmiyor.
NOT: İndeksleyiciler de aşırı yüklenebilir. Bunu ise parametre türünü farklı yaparak sağlarız.
NOT: İndeksleyicilerin parametre ve geri dönüş tipi herhangi bir tip olabilir. int olması şart değildir.
Çok boyutlu indeksleyiciler
değiştirÇok boyutlu indeksleyicilerin tek boyutlu indeksleyicilerden tek farkı indeksleyicinin aldığı parametre sayısıdır. Örnek:
using System;
class Sinif
{
private int Sayi;
public int this[int indeks1,int indeks2]
{
get
{
return indeks1+indeks2+Sayi;
}
set
{
Sayi=indeks1*indeks2+value;
}
}
}
class AnaProgram
{
static void Main()
{
Sinif a=new Sinif();
a[5,4]=45;
Console.WriteLine(a[-6,12]);
}
}
Bu programda a[5,4]=45;
satırında 5*4+45 işlemi yapılır ve sonuç Sayi özelliğine atanır. Console.WriteLine(a[-6,12]);
satırında ise -6+12+65 işlemi yapılır ve sonuç ekrana yazılır. (sonuç: 71)
NOT: Aslında indeksleyicilerin en yaygın kullanımı sınıfımız içindeki bir dizinin elemanlarına direkt nesne ve [] operatörünü kullanarak erişmektir. Bunu mantığınızı kullanarak yapabilirsiniz. Anlatma gereksinimi görmüyorum.
NOT: İndeksleyicilerin set ve get blokları sahte özelliklerdeki set ve get bloklarının tüm özelliklerini taşırlar. Örneğin set blokunu koymayarak nesnenin indekslerine değer atanmasını engelleyebiliriz.