Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 17. Семейства. Индексаторы.doc
Скачиваний:
132
Добавлен:
24.02.2016
Размер:
121.34 Кб
Скачать

Индексаторы и пользовательские классы

Индексаторы используются также с “обычными классами”, то есть индексаторы работают не только с семействами. Например, если у класса есть скрытое поле, представляющее собой массив, то с помощью индексатора можно обратиться к элементу этого массива, используя имя экземпляра класса и номер элемента массива в квадратных скобках. То есть индексатор - это такой “умный” индекс для экземпляров класса.

Примерпрограммы класса “Одномерный массив”, элементы которого должны находиться в диапазоне от 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.