C# Indexers (Indeksleyiciler)

Merhaba arkadaşlar,

Bu yazımda C#’ta Indexer (Indeksleyiciler) kullanımını ele alacağız. Bir önceki yazımda Operatörlerin Aşırı Yüklenmesini ele almıştık. C# Operator Overloading (Operatör Aşırı Yükleme) yazıma buradan ulaşabilirsiniz.

Bu yazıda bahsedilecek konular

  • Indeksleyiciler
    • Tek Boyutlu Indeksleyici
    • Çok Boyutlu Indeksleyici

İndeksleme (indexing) sözcüğü [] operatöründen gelmektedir. Diziler konusunda [] operatörü ile dizinin elemanına ulaşabildiğimizi biliyoruz. İndeskleyiciler genelde sınıfımızın üye elemanlarından biri dizi ya da benzeri bir yapıda ise anlamlı olmaktadır. Bu amacın dışında kullanılabilir ancak iyi bir programcı hiçbir zaman operatörleri amacının dışında kullanmamalıyız.

Tek Boyutlu İndeksleyici

En genel anlamda tek boyutlu indeksleyici aşağıdaki gibi tanımlanır.

Yukarıdaki yapıya bakacak olursak [] operatörünün kullanılıyor. Eleman_Tip [] operatörü ile ulaşılmak istenen nesnenin türünü, index_tipi ise [] operatörü ile kullanılacak indeksin türünü bildiriyoruz. Dizilerde bu tip tipik olarak int türündendir ancak bunun int türünden olma zorunluluğu yoktur. Ama int dışında bir tür kullanmak indeksleyicinin var oluş amacına ters düşeceği için genelde int türü kullanılır.

Şimdi indeksleyici çalışma mantığını görmek için küçük bir örnek yapalım;

Yukarıdaki örnekte get bloğu sayesinde geriye döndürülen değer index*index yani bir sayının karesi dönüyor. set bloğu ise IndexerManager sınıfının elemanı olan number değişkenine gönderilen value değeri atanıyor.

Indeksleyicilerde metotlar gibi aşırı yüklenebilir. Bir sınıf için aşırı yüklenmiş dizilerin kullanılması çok az rastlanır. Zaten buda pek tercih edilen bir yöntem değildir.

Şimdi bu bilgilere göre işimize yarayabilecek bir örnek ile bu olayı pekiştirmeye çalışalım. İndeksleyiciler çoğunlukla üye elemanlarından biri dizi olduğunda ve bu dizi elemana [] yardımı ile erişmek için kullanılır.

SingleIndexer sınıfının yapıcı metodu (constructor) ile dizinin boyutu belirleniyor. Daha sonra yine [] operatör yardımı ile elemanlar diziye aktarılıyor ve son olarak sınıftan eklenen elemanların değerini okumak için yine [] operatörü ile erişebiliyoruz.

Çok Boyutlu Indeksleyici

Çok boyutlu indeksleyicilerin kullanımı tek boyutlu indeksleyici ile aynıdır tek farkı ilgilen dizinin boyutlarının farklı olmasıdır.

İki boyutlu indeksleyiciye örnek vermek gerekirse;

Çok boyutlu indeksleyicide []operatörünin iki index parametresi alıyor ve geriye gönderilen iki index değerinin çarpımını dönüyor ve yine set bloğu tek boytlu indekslerde olduğu gibi alınan değeri number değişkenine aktarıyor. Tek boyutlu indeksleyiciden tek farkı [] operatörünün iki indeks değeri alması. Bu sayede mult-dimension array ile çalışabilme ve çok boyutlu indeks özelliğini sağlanmış oluyor.

Çok boyutlu indeksleyicilere ısındığımıza göre hadi şimdi çok-boyutlu dizilerle çalışabilen sınıfımızı tasarlayalım.

Yapmış olduğumuz örnekte yapıcı metot ile çok boyutu indeksleyicimizin boyutlarını belirlemek oldu. Bu sayede sınıfımızın içindeki çok-boyutlu dizi boyutunu belirledik. [int,int] operatörü yardımı ile çok-boyutlu dizimize elemanları aktarabiliyoruz ve yine bu operatör sayesinde elemanlara erişebiliyoruz. Burada dikkat edilmesi gereken özellik ise GetLengthOfDimension() dize eklediğimiz özellik. Bu metot sayesinde çok-boyutlu dizimizin boyut uzunluğunu öğreniyoruz. Zaten bu metodun içinde aslında dizimizin GetLength() metodundan yararlanılıyor bu sayede her bir boyutun uzunluğunu öğrenmiş oluyoruz.

Burada dikkat edilmesi gereken konu indeksleyiciler için kullandığımız dizilerin object türünden olması. Bunu yapmamızın sebebi aslında farklı veri tiplerini tek bir çatı altında yönetebilmek ama bununda dezavantajları var. En önemli dezavantajı ise performans sorunu. Bu konuyu şablon tipli (generics) yapılar ile çözebiliriz. Google it -> şablon tipli yapılar 🙂

Evet bir yazının daha sonuna geldik. Bu yazımda C# Indexer (Indeksleyici) hakkında edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur.

Bir sonraki yazımda görüşmek üzere … 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/api/system.io?view=netframework-4.8

Leave a Comment