Индексаторы и пользовательские классы
Индексаторы используются также с “обычными классами”, то есть индексаторы работают не только с семействами. Например, если у класса есть скрытое поле, представляющее собой массив, то с помощью индексатора можно обратиться к элементу этого массива, используя имя экземпляра класса и номер элемента массива в квадратных скобках. То есть индексатор - это такой “умный” индекс для экземпляров класса.
Примерпрограммы класса “Одномерный массив”, элементы которого должны находиться в диапазоне от 0 до 100. Кроме того, при доступе к элементу проверяется, не вышел ли индекс за допустимые границы.
namespace ConsoleApplication1
{ class MyArray
{ public MyArray(int size) //конструктор инициализации
// задает кол-во элементов массива
{length = size; a = new int[length];}
public int Length //свойство-размерность
{ get { return Length; } }
public int this[int i] //индексатор
{get
{//проверка на допустимые границы по размерности
if (i >= 0 && i < length) return a[i];
else { error = true; return 0; }
}
set {//проверка на допустимые границы по значениям (от 0 до 100)
if (i >= 0 && i < length && value>=0 && value<=100 ) a[i]=value;
else error = true; }
}
//поля класса, данное error-признак ошибки
public bool error = false;
int []a;
int length;
}
class Program
{static void Main(string[] args)
{ int n = 100;
MyArray mas = new MyArray(n); //создание экземпляра
for (int i = 0; i < n; i++)
{
/*/ mas[i] = i * 2; //задание элементам массива значений
/**/ Console.Write(mas[i]+" ");
}
Console.WriteLine();
//если происходил выход за пределы – данное error имеет значение true
if (mas.error) Console.WriteLine(" Были обнаружены ошибки!!!");
Console.ReadKey();
}
}
}
Из примера видно, что индексаторы описываются аналогично свойствам. Благодаря применению индексатора с экземпляром класса, в котором есть массив, можно работать так же, как с обычным массивом.
Если обращение к экземпляру встречается в левой частиоператора присваивания (/*/), то автоматически вызывается частьget. Если обращение происходитв составе выражения (/**/), то вызывается частьset.
В классе MyArrayесли при попытке записи элемента массива его индекс или значения заданы не верно, то значение элементу не присваивается, если при попытке чтения элемента индекс не в допустимом диапазоне, возвращается 0, значение поляerrorпринимаетсяtrue.