Индексаторы. Специальные приемы построения типов. Создание одномерных и двумерных индексаторов

В некот. ситуациях бывает удобно индексировать содержимое объекта так, словно он представляет собой массив. Индексация массивов реализуется с использованием оператора [ ]. Св-ва и индексаторы расширяют возм-сти класса. Свойства и индексаторы расширяют возможности класса. Св-ва предлагают эффект. способ управления доступом к данным экземпляра класса. Индексаторы обеспечивают механизм, посредством кот. к объектам можно получать доступ по индексам на основе синтаксиса массивов. Индексатор позволяет обеспечить индексированный доступ к объекту. Гл. назначение – создавать специализированные массивы, на кот. налагается одно или несколько ограничений. Индексаторы служат для доступа к классам, содержащим наборы похожих элементов. При работе с коллекциями доступ 1) к их содержимому осуществляется с помощью индексатора. С помощью индексатора можно также работать с коллекцией, как с обычным массивом. 2) привести примеры семейств из офисных пакетов. 3) при использовании индексаторов пользовательские типы коллекции лучше согласуются со структурой библиотек базовых классов .Net. Индексатор в С# представляет собой несколько “искаженное” свойство. Объявление индексаторов позволяет создать классы, имитирующие виртуальные массивы. Индексаторы могут характеризоваться одной или несколькими размерностями. Одномерные индексаторы. Формат записи: public Тип_возврата this[int index] { get { // возврат значения, заданного с пом.индекса } set { // установка значения, заданного с пом.индекса } } Объявление индексатора очень похоже на объявление св-ва. Оба аксессора в кач-ве параметра принимают индекс. Если индекс стоит слева от оператора присваивания, то вызывается аксессор set и устанавливается элемент, заданный параметром индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Индексаторы необязат.создавать с поддержкой как get- , так и set- аксессоров. Можно создать индексатор, предназначенный только для чтения (реализовав только get-аксессор) или только для записи (реализовав только set-аксессор). Индексаторы можно перегружать. Чаще всего индексатор перегружается, чтобы иметь возможность использовать объект класса в качестве индекса, значение которого вычисляется специальным образом. Индексаторы без использования базового массива. Индексатор может не использовать базовый массив. Вполне достаточно, чтобы индексатор обеспечивал функционирование, кот. для пользователя выглядело бы, как будто идет работа с массивом (виртуальный массив). Создание двумерного индексатора. Можно создавать и многомерные индексаторы. Задание 3: Добавить в проект Matrix класс bezop_mas2D, содержащий двумерный индексатор: class bezop_mas2D

{ int [,] mas; // ваше имя массива

int rows, cols; // ваши имена размерностей

public int dlina; // количество элементов в матрице

public bool errflag; //коструктор

public beop_mas2D(int r, int c)

{ rows = r; сols = c; mas = new int[rows, cols]; dlina = rows * cols; }

//Индексатор:public int this [int index1, int index2]

{ get { if(ok(index1, index2))

{ errflag = false; return mas[index1, index2]; }

else { errflug = true; return 0; } }

set { if(ok(index1, index2))

{ mas[index1, index2] = value; errflag = false; }

else errflag = true; }

private bool ok(int index1, int index2)

{ if(index1 >= 0 && index1 < rows && index2 >= 0 && index2 < cols)

return true;

return false; } ←// для индексатора }←// для класса

//Проверить работу класса в main():

bezop_mas2D mas2D = new bezop_mas2D(3,5);

Console.WriteLine(“Мягкое приземление при работе с матрицей”);

for (i = 0; i < 6; i++) mas2D[i, i] = I * 10;

Console.WriteLine(“Работа с уведомлением об ошибках”);

for(i = 0; i < 6; i++)

{ mas2D[i, i] = i * 10; If(mas2D.errflag)

Console.WriteLine(“mas2D[” + i + “,” + i + “] вне границ”); } Console.WriteLine();

Cоnsole.WriteLine(“Создана матрица”); for(i = 0; i < 6; i++) {x = mas2D[i, i];

if(!mas2D.errflag) Console.Write(x + “ ”);

else Console.WriteLine(“mas2D[” + i + “,” + i + “] вне границ”); } } }

Индексаторы и свойства применяются для разработки массивов ( в виде класса ), в которых границы индексов устанавливает пользователь, т.к. не всегда удобна индексация с нуля.