/* Доступ к логическому массиву, содержащему степени числа 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]);
Вот к какому результату приводит выполнение этой программы.
Первые 8 степеней числа 2: 1 2 4 8 16 32 64 128 А это некоторые ошибки: -1 -1
Обратите вйимание на то, что в индексатор класса PwrOf Two включен только аксессор get, но в нем отсутствует аксессор set. Как пояснялось выше, такой индексатор служит только для чтения. Следовательно, объект класса PwrOf Two может указываться только в правой части оператора присваивания, но не в левой его части. Например, попытка ввести следующую строку кода в приведенную выше программу не приведет к желаемому результату.
pwr[0] =11; //не подлежит компиляции
Такой оператор присваивания станет причиной появления ошибки во время компиляции, поскольку для индексатора не определен аксессор set.
На применение индексаторов накладываются два существенных ограничения. Во-первых, значение, выдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out, поскольку в индексаторе не определено место в памяти для его хранения. И во-вторых, индексатор должен быть членом своего класса и поэтому не может быть объявлен как static.
Многомерные индексаторы
Индексаторы можно создавать и для многомерных массивов. В качестве примера ниже приведен двумерный отказоустойчивый массив. Обратите особое внимание на объявление индексатора в этом примере.
// Двумерный отказоустойчивый массив.
using System;
class FailSoftArray2D {
int[,] a; // ссылка на базовый двумерный массив int rows, cols; // размеры массива
public int Length; // открытая переменная длины массива public bool ErrFlag; // обозначает результат последней операции
// Построить массив заданных размеров, public FailSoftArray2D(int г, int с) { rows = г; cols = с;
а = new int[rows, cols];
Length = rows * cols;
}
// Это индексатор для класса FailSoftArray2D. public int this[int indexl, int index2] {
// Это аксессор get. get {
if(ok(indexl, index2)) {
ErrFlag = false;
return a[indexl, index2];
