Шаг 129.
Язык программирования C#. Начала
Свойства и индексаторы. Использование индексаторов (продолжение)

    На этом шаге мы рассмотрим еще один пример использования идексаторов, в частности, случай, когда имеерся только get-аксессор.

    В следующем примере рассматривается ситуация, когда индексатор имеет только get-аксессор. Интересующая нас программа представлена ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr129_1
{
    // Класс с индексатором: 
    class MyClass {
        // Закрытое целочисленное поле: 
        private int number;
        // Конструктор с одним аргументом: 
        public MyClass (int n){
            // Присваивание значения полю: 
            number = n;
        }
        // Целочисленный индексатор с целочисленным индексом: 
        public int this[int k] {
        // Метод вызывается при считывании значения выражения
        //с проиндексированным объектом:
            get {
                // Целочисленная переменная:
                int n = number;
                // "Отбрасывание" цифр из младших разрядов:
                for (int i = 1; i < k; i++) {
                    n /= 10;
                }
                // Значение свойства: 
                return n % 10;
            }
        }
    }

    // Класс с главным методом: 
    class Program
    {
        // Главный метод: 
        static void Main()
        {
            // Создание объекта:
            MyClass obj = new MyClass(12345);
            // Цифры в десятичном представлении числа: 
            for(int k = 1; k < 9; k++){
                Console.Write(" | " + obj[k]);
            }
            Console.WriteLine(" |");
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы вполне ожидаем.


Рис.1. Результат выполнения программы

    У класса MyClass есть закрытое целочисленное поле, значение которому присваивается при создании объекта. Индексатор, описанный в классе, имеет только get-аксессор. При индексировании объекта результатом возвращается цифра в десятичном представлении числа, записанного в поле number. Индекс, указанный при индексировании объекта, определяет позицию цифры в десятичном представлении числа.


Индексатор определен так, что наименьшему разряду (единице) в десятичном представлении числа соответствует индекс 1. Десяткам соответствует индекс 2, сотням соответствует индекс 3 и так далее. Если при индексировании объекта указать индекс, меньший 1, то результатом будет цифра в разряде единиц. То есть для отрицательного индекса или индекса 0 результат такой же, как и для индекса 1.

    Для вычисления значения индексатора в теле get-акссссора командой

  int n = number;
объявляется локальная переменная n, в которую записывается значение поля number. Задача состоит в том, чтобы вычислить цифру, которая находится в десятичном представлении числа в позиции с порядковым номером k (целочисленный индекс, указанный в описании индексатора). Для этого мы "отбрасываем" в десятичном представлении числа k-1 цифру, а цифра, оказавшаяся последней, возвращается как результат. Для этого сначала запускается цикл, и в нем k-1 раз выполняется команда
  n /= 10;    , 
которой текущее значение переменной n делится нацело на 10, а результат записывается в переменную n. Одна такая операция эквивалентна отбрасыванию в десятичном представлении значения переменной n одной цифры в младшем разряде (отбрасывается цифра справа). После выполнения цикла интересующая нас цифра станет последней. Ее можно вычислить как остаток от деления числа на 10 (команда n%10). Это и есть результат.

    В главном методе программы мы создаем объект оbj, полю number которого присваивается значение 12345. Затем запускается цикл (из восьми итераций), и за каждую итерацию отображается значение obj[k]. В итоге мы получаем цифры из десятичного представления числа, только не справа налево (как они записаны в числе), а слева направо. Причем нули соответствуют тем разрядам, которые в числе не представлены.

    На следующем шаге мы продолжим изучение вопроса.




Предыдущий шаг Содержание Следующий шаг