Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Индексаторы без базового массива C# Полное руководство Герберт Шилдт

Индексаторы без базового массива C# Полное руководство Герберт Шилдт

Следует особо подчеркнуть, что индексатор совсем не обязательно должен оперировать массивом. Его основное назначение — предоставить пользователю функциональные возможности, аналогичные массиву. В качестве примера в приведенной ниже программе демонстрируется индексатор, выполняющий роль массива только для чтения, содержащего степени числа 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();
   }
}

Вот к какому результату приводит выполнение этой программы:
   Первые 8 степеней числа 2: 1 2 4 8 16 32 64 128
   А это некоторые ошибки: -1 -1

Обратите внимание на то, что в индексатор класса PwrOfTwo включен только аксессор get, но в нем отсутствует аксессор set. Как пояснялось выше, такой индексатор служит только для чтения. Следовательно, объект класса PwrOfTwo может указываться только в правой части оператора присваивания, но не в левой его части. Например, попытка ввести следующую строку кода в приведенную выше программу не приведет к желаемому результату:
   pwr[0] = 11; // не подлежит компиляции
Такой оператор присваивания станет причиной появления ошибки во время компиляции, поскольку для индексатора не определен аксессор set.
На применение индексаторов накладываются два существенных ограничения. Во-первых, значение, выдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out, поскольку в индексаторе не определено место в памяти для его хранения. И во-вторых, индексатор должен быть членом своего класса и поэтому не может быть объявлен как static.