Следует особо подчеркнуть, что индексатор совсем не обязательно должен оперировать массивом. Его основное назначение — предоставить пользователю функциональные возможности, аналогичные массиву. В качестве примера в приведенной ниже программе демонстрируется индексатор, выполняющий роль массива только для чтения, содержащего степени числа 2 от 0 до 15. Обратите внимание на то, что в этой программе отсутствует конкретный массив. Вместо этого индексатор просто вычисляет подходящее значение для заданного индекса.
//индексаторы совсем не обьязательно должны оперировать отдельными массивами.
using System;
class PwrOfTwo
{
//доступ к логическому массиву, содержащему степени числа 2 от 0 до 15
public int this[int index]
{
//вычислить и возвратить степень числа 2
get
{
if ((index >= 0) && (index < 16)) return pwr(index);
else return -1;
}
//аксессор set отсутствует.
}
int pwr(int p)
{
int result = 1;
for (int i = 0; i < p; i++)
result *= 2;
return result;
}
}
class UsePwrOfTwo
{
static void Main()
{
PwrOfTwo pwr = new PwrOfTwo();
Console.Write("Первые 8 степеней числа 2: ");
for (int i = 0; i < 8; i++)
Console.Write(pwr[i] + " ");
Console.WriteLine();
Console.Write("А это некоторые ошибки: ");
Console.Write(pwr[-1] + " " + pwr[17]);
Console.WriteLine();
}
}
На применение индексаторов накладываются два существенных ограничения:
1. Во-первых, значение, выдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out, поскольку в индексаторе не определено место в памяти дляего хранения.
2. И во-вторых, индексатор должен быть членом своего класса и поэтому не может быть объявлен как static.