C# Indexer Property Kullanımı
C# dilinde indexer property’ler, bir sınıf veya struct örneklerini, diziler veya koleksiyonlar gibi indekslenebilir hale getiren özel bir tür property’dir. Indexer’lar, sınıf üyelerine dizi benzeri bir erişim yöntemi sunarak, bir sınıfın örneklerini sanki bir dizi veya List’miş gibi kullanılmasına olanak tanır. Indexer’lar, this
anahtar kelimesi ile tanımlanır ve genellikle bir dizi erişim operatörü ([]) kullanılarak erişilir. Bu sayede, sınıf içindeki verilere veya elemanlara indeks aracılığıyla dinamik olarak erişim sağlanabilir.
Indexer’lar aynı propertyler gibi tanımlanır. Fakat geri dönüş tipinden sonra this kelimesi ve [] parantezler vardır.
<return type> this[<parameter type> index]
{
get{
// return the value from the specified index of an internal collection
}
set{
// set values at the specified index in an internal collection
}
}
Aşağıdaki kullanım, bir indexer’in sınıfa ait olan koleksiyona nasıl eriştiğini göstermektedir.
class StringDataStore
{
private string[] strArr = new string[10]; // internal data storage
public string this[int index]
{
get
{
if (index < 0 || index >= strArr.Length)
throw new IndexOutOfRangeException("Index out of range");
return strArr[index];
}
set
{
if (index < 0 || index >= strArr.Length)
throw new IndexOutOfRangeException("Index out of range");
strArr[index] = value;
}
}
}
Yukrıdaki StringDataStore sınıfı içindeki private olan strArr dizisi için bir indexer tanımlıyor. Dolayısıyla biz bu sınıfı aynı dizi gibi kullanabileceğiz.
StringDataStore strStore = new StringDataStore();
strStore[0] = "One";
strStore[1] = "Two";
strStore[2] = "Three";
strStore[3] = "Four";
for(int i = 0; i < 10 ; i++)
Console.WriteLine(strStore[i]);
c# 7 den sonra “expression-bodied systax” ile get ve set tanımları kısaltıldı.
class StringDataStore
{
private string[] strArr = new string[10]; // internal data storage
public string this[int index]
{
get => strArr[index];
set => strArr[index] = value;
}
}
Generic Indexer
Indexer’ler generic olabilir. İhtiyaca yönelik tek bir Indexer tanımlayarak verilen tip üzerinden bir koleksiyon oluşturup kullanılabilir. Çünkü C# compiler property’leri birer metot olarak tanmladığı için, her bir generic property farklı bir metot imzası ile Assembly Manifest tablolarında tanımlanacaktır. Genereic Indexer aşağıdaki gibi tanımlanır.
class DataStore<T>
{
private T[] store;
public DataStore()
{
store = new T[10];
}
public DataStore(int length)
{
store = new T[length];
}
public T this[int index]
{
get
{
if (index < 0 && index >= store.Length)
throw new IndexOutOfRangeException("Index out of range");
return store[index];
}
set
{
if (index < 0 || index >= store.Length)
throw new IndexOutOfRangeException("Index out of range");
store[index] = value;
}
}
public int Length
{
get
{
return store.Length;
}
}
}
Yukarıdaki sınıfta iki tane Constructor metot bulunmaktadır, biri Default-constructor ve boyutu 10 olan bir koleksiyon tanımlarken, diğeri ise Parametrized-constractor olup koleksiyon boyutunu parametre olarak almaktadır. Return değeri de generic olan geçilen “T” tipidir. Aşağıdaki örnek iki farklı tip ile kullanımını göstermektedir.
// Int tipi ile kullanımı
DataStore<int> grades = new DataStore<int>();
grades[0] = 100;
grades[1] = 25;
grades[2] = 34;
grades[3] = 42;
grades[4] = 12;
grades[5] = 18;
grades[6] = 2;
grades[7] = 95;
grades[8] = 75;
grades[9] = 53;
for (int i = 0; i < grades.Length;i++)
Console.WriteLine(grades[i]);
// String ile kullanımı
DataStore<string> names = new DataStore<string>(5);
names[0] = "Steve";
names[1] = "Bill";
names[2] = "James";
names[3] = "Ram";
names[4] = "Andy";
for (int i = 0; i < names.Length;i++)
Console.WriteLine(names[i]);
Yazıyı, yeni başlayanlar veya İngilizcesi yeterli olmayanlar için mümkün olduğunca anlaşılır bir şekilde yazmaya çalıştım. Umarım faydalı olmuştur. Aklınıza takılan herhangi bir soruyu çekinmeden yorumlarda sorabilirsiniz.
Yaralanılan Kaynaklar: