Indeksery pozwalają na indeksowanie obiektów w taki sam sposób jak ma to miejsce w tablicach. Kiedy definiujemy indeksery dla klas,
zachowuje się ona w podobny sposób do wirtualnej tablicy. Można uzyskać dostęp do instancji tej klasy przy użyciu operatora dostępu
do tablicy, tj. ([]).
Składnia definicji jednowymiarowego indeksera:
typ_elementu this[int index]
{
get
{
// zwracanie wartości wskazanej przez indeks
}
set
{
// ustawienie wartości wskazanej przez indeks
}
}
Używanie indekserów
Deklaracja zachowania indeksera jest pewnym sensie podoba do właściwości. Deklarując indekser również będziemy używać akcesorów
get oraz set. Jednakże, właściwość zwróci lub ustawi dane dla
konkretnego elementu, podczas gdy indekser zwróci lub ustawi konkretną wartość z instancji obiektu. Innymi słowy, zbiór danych
zostaje podzielony na mniejsze części a indekser zwraca lub ustawia wartości dla poszczególnych elementów.
Definiowanie właściwości składa się z określenia nazwy. W przypadku indekserów nie używamy nazwy, ale słowa kluczowego
this, które wskazuje na instancje obiektu. Poniższy przykład w przystępniejszy sposób pozwoli na
zapoznanie się z użyciem indekserów:
using System;
namespace Indeksery
{
class Program
{
// lista naszych nazw
private string[] nameList = new string[size];
// rozmiar
static int size = 10;
static void Main(string[] args)
{
Program names = new Program();
names[0] = "Audi";
names[1] = "Pagani";
names[2] = "BMW";
names[3] = "Nissan";
for (int i = 0; i < size; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
// Konstruktor klasy powoduje wypełnienie listy elementami 'N.A'
public Program()
{
for (int i = 0; i < size; i++)
{
nameList[i] = "N.A";
}
}
// Indekser
public string this[int index]
{
get
{
string temp;
if (index >= 0 && index <= size - 1)
temp = nameList[index];
else
temp = "";
return temp;
}
set
{
if (index >= 0 && index <= size - 1)
nameList[index] = value;
}
}
}
}
Przeciążanie indekserów
Indeksery mogą również zostać przeciążone. Indeksery mogą być również zdefiniowane z wieloma parametrami a każdy z parametrów
może być innego typu. Indeksery nie muszą być typami całkowitymi. C# dopuszcza, aby indeksery były innymi typami, np.
string.
Poniższy przykład pokazuje sposób użycia indekserów przeciążonych:
using System;
namespace Indeksery
{
class Program
{
// lista naszych nazw
private string[] nameList = new string[size];
// rozmiar
static int size = 10;
static void Main(string[] args)
{
Program names = new Program();
names[0] = "Audi";
names[1] = "Pagani";
names[2] = "BMW";
names[3] = "Nissan";
// używanie indeksera z parametrem typu int
for (int i = 0; i < size; i++)
{
Console.WriteLine(names[i]);
}
// użycie indeksera z parameterem typu string
Console.WriteLine(names["BMW"]);
Console.ReadKey();
// Wynik działania programu
// Audi
// Pagani
// BMW
// Nissan
// N.A
// N.A
// N.A
// N.A
// N.A
// N.A
// 2
}
// Konstruktor klasy powoduje wypełnienie listy elementami 'N.A'
public Program()
{
for (int i = 0; i < size; i++)
{
nameList[i] = "N.A";
}
}
// Indekser
public string this[int index]
{
get
{
string temp;
if (index >= 0 && index <= size - 1)
temp = nameList[index];
else
temp = "";
return temp;
}
set
{
if (index >= 0 && index <= size - 1)
nameList[index] = value;
}
}
public int this[string name]
{
get
{
int index = 0;
while (index < size)
{
if (nameList[index] == name)
return index;
index++;
}
return index;
}
}
}
}