русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Индексаторы


Дата добавления: 2013-12-23; просмотров: 842; Нарушение авторских прав


Индексатор представляет собой разновидность свойства и обычно применяется для организации доступа к скрытым полям класса по индексу, например, так же, как мы обращаемся к элементу массива. Синтаксис индексатора аналогичен синтаксису свойства:

[атрибуты] [спецификаторы] тип this [список параметров] // последние [ ] являются элементами синтаксиса{ [get код_доступа] [set код_доступа]}

Спецификаторы аналогичны спецификаторам свойств и методов. Индексаторы чаще всего объявляются со спецификатором public, поскольку они входят в интерфейс объекта. Атрибуты и спецификаторы могут отсутствовать.

Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) значения некоторого элемента класса. Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, индексатор доступен только для чтения, если отсутствует часть get, индексатор доступен только для записи.

Список параметров содержит одно или несколько описаний индексов, по которым выполняется доступ к элементу. Чаще всего используется один индекс целого типа.

В качестве примера рассмотрим индексатор, который позволяет получить n-член последовательности Фиббоначи:

class DemoFib { public int this[int i] //индексатор, доступный только для чтения { get { if (i <=0) throw new Exception("недопустимое значение индекса"); else if (i==1 || i==2) return 1; else {int a=1, b=1, c; for (int j=3; j<=i; ++j) { c=a+b; a=b; b=c; } return b; } } } } class Program { static void Main() { Console.Write("n="); int n=int.Parse(Console.ReadLine()); DemoFib a=new DemoFib(); try { Console.WriteLine("a[{0}]={1}",n,a[n]); } catch (Exception e) { Console.WriteLine(e.Message); } } }

Индексаторы очень удобно применять для создания специализированных массивов, на работу с которыми накладываются какие-либо ограничения. Рассмотрим в качестве примера класс-массив, значения элементов которого находятся в диапазоне [0, 100]. Кроме того, при доступе к элементу проверяется, не вышел ли индекс за допустимые границы.



class DemoArray { int[] MyArray;//закрытый массив public DemoArray(int size)//конструктор { MyArray = new int[size]; } public int LengthArray //свойство, возвращающее размерность { get { return MyArray.Length; } } public int this[int i] //индексатор { get { if (i <0 || i >= MyArray.Length) throw new Exception("выход за границы массива"); else return MyArray[i]; } set { if (i <0 || i >= MyArray.Length) throw new Exception("выход за границы массива"); else if (value >= 0 && value <= 100) MyArray[i] = value; else throw new Exception("присваивается недопустимое значение"); } } } class Program { static void Main() { DemoArray a = new DemoArray(10); for (int i=0; i<a.LengthArray; i++) { a[i] = i * i; // использование индексатора в режиме записи Console.Write(a[i]+" ");// использование индексатора в режиме чтения } Console.WriteLine(); try { //a[10]=100; //a[0]=200; } catch (Exception e) { Console.WriteLine(e.Message); } } }

Задание. В блоке try содержатся две закомментированные команды. Посмотрите, как проведет себя программа, если убрать комментарии: вначале один, затем другой.

Язык С# допускает использование многомерных индексаторов. Они применяются для работы с многомерными массивами. Рассмотрим на примере предыдущую задачу при условии, что организуется двумерный массив.

class DemoArray { int[,] MyArray;//закрытый массив int n, m;//закрытые поля: размерность массива public DemoArray(int sizeN, int sizeM)//конструктор { MyArray = new int[sizeN, sizeM]; this.n = sizeN; this.m = sizeM; } public int LengthN //свойство, возвращающее количество строк { get { return n; } } public int LengthM //свойство, возвращающее количество строк { get { return m; } } public int this[int i, int j] //индексатор { get { if (i < 0 || i >= n || j < 0 || j >= m) throw new Exception("выход за границы массива"); else return MyArray[i, j]; } set { if (i < 0 || i >= n || j < 0 || j >= m) throw new Exception("выход за границы массива"); else if (value >= 0 && value <= 100) MyArray[i, j] = value; else throw new Exception("присваивается недопустимое значение"); } } } class Program { static void Main() { DemoArray a = new DemoArray(3, 3); for (int i = 0; i < a.LengthN; i++,Console.WriteLine()) { for (int j = 0; j < a.LengthM; j++) { a[i, j] = i *j; // использование индексатора в режиме записи Console.Write("{0,5}", a[i, j]);// использование индексатора в режиме чтения } } Console.WriteLine(); try { //Console.WriteLine(a[3,3]); //a[0,0]=200; } catch (Exception e) { Console.WriteLine(e.Message); } } }

Задание. В блоке try содержатся две закомментированные команды. Посмотрите, как проведет себя программа если убрать комментарии - вначале один, затем другой.

13.8 Операции класса

С# позволяет переопределить большинство операций так, чтобы при использовании их объектами конкретного класса выполнялись действия, отличные от стандартных. Это дает возможность применять объекты собственных типов данных в составе выражений, например:

newObject x, y, z;…z = x+y; // используется операция сложения, переопределенная для класса newObject

Определение собственных операций класса называют перегрузкой операций. Перегрузка операций обычно применяется для классов, для которых семантика операций делает программу более понятной. Если назначение операции интуитивно непонятно, перегружать такую операцию не рекомендуется.

Операции класса описываются с помощью методов специального вида, синтаксис которых выглядит следующим образом:

[ атрибуты] спецификаторы объявитель_операции{тело}

В качестве спецификаторов одновременно используются ключевые слова public и static. Кроме того, операцию можно объявить как внешнюю - extern. Объявление операции может выглядеть по-разному, в зависимости от того, что мы перегружаем: унарную или бинарную операцию.

При описании операций необходимо соблюдать следующие правила:

  1. операция должна быть описана как открытый статический метод класса (public static);
  2. параметры в операцию должны передаваться по значению (то есть недопустимо использовать параметры ref и out);
  3. сигнатуры всех операций класса должны различаться;
  4. типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (то есть должны быть доступны при использовании операции).


<== предыдущая лекция | следующая лекция ==>
Деструкторы | Унарные операции


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.