C# esetén a tömbök indexelésére használatos szögletes zárójelek, más néven indexer operátorok nem definiálhatóak át a hagyományos módon. Ennek több oka van. A legnyomósabb érv az, hogy ha indexelésen kívül más célra is lehetne őket definiálni, akkor az igencsak káoszt teremtene egy hozzá nem értő programozó kezében.
Azonban indexelési lehetőséget definiálhatunk az osztályunkban. Az indexelési lehetőség lényegében egy olyan tulajdonsága az osztálynak, ami tömbhöz hasonló hozzáférést tesz lehetővé az osztályunk belső elemeihez.
A korábban ismertetett adatstruktúrák közül az indexelhetőek (Lista, Tömb, HashSet, Dictionary) mind rendelkeznek saját indexer megvalósítással, így nyelvi szempontból ezen osztályok ugyanúgy használhatóak, mint a tömbök.
Az indexer tulajdonság szintaxisa:
public <vissza típus> this[<index típus> változó]
{
get { //get ág }
set { //set ág }
}
Az indexer tulajdonságnak nem lehet saját neve. Az osztály nevén keresztül hivatkozunk rá, ezért szerepel az implementációban a this. A set rész elhagyható és ugyanúgy protected, vagy private jelzőkkel is ellátható, mint a többi tulajdonság. A hagyományos tulajdonságokhoz képest az indexer nem lehet automatikusan definiált.
Az alábbi példa egy indexer megvalósítást mutat be:
using System;
namespace PeldaIndexer
{
class Program
{
class IntToString
{
public string this[int i]
{
get
{
switch (i)
{
case 0:
return "Nulla";
case 1:
return "Egy";
case 2:
return "Kettő";
case 3:
return "Három";
case 4:
return "Négy";
case 5:
return "Öt";
case 6:
return "Hat";
default:
throw new NotImplementedException();
}
}
}
}
static void Main(string[] args)
{
try
{
var converter = new IntToString();
for (int i=0; i<8; i++)
{
Console.WriteLine("{0} = {1}", i, converter[i]);
}
}
catch (NotImplementedException)
{
Console.WriteLine("Ez már nincs implementálva");
}
Console.ReadKey();
}
}
}
A program kimenete:
0 = Nulla
1 = Egy
2 = Ketto
3 = Három
4 = Négy
5 = Öt
6 = Hat
Ez már nincs implementálva