Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Индексаторы






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

[атрибуты] [спецификаторы] тип 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); }

}

}

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

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(a[i, j]); //использование индексатора в режиме чтения

}

}

Console.WriteLine();

try

{

//Console.WriteLine(a[3, 3]);

//a[0, 0]=200;

}

catch (Exception e)

{ Console.WriteLine(e.Message); }

}

}

 

3. «Один класс – один файл»

С добавлением новых классов в программу резко увеличивается ее размер, что затрудняет ее прочтение. Поэтому следует руководствоваться одним простым принципом «один класс – один файл». Для того чтобы создать новый файл для класса Circle выполним следующие действия:

1. В окне Solution Explorer щелкните правой кнопкой на имени проекта Hello (на рисунке 3.2 выделен жирным).

Рисунок 3.2 – Окно программы

2. Выполните команду Add/Add Class…

Далее откроется окно добавления нового элемента как показано на рисунке 3.3.

Рисунок 3.3 – Окно добавления нового элемента

В поле Name напишите Сircle.cs и нажмите кнопку Add.

Теперь окно Solution Explorer выглядит так, как показано на рисунке 3.4

Рисунок 3.4 – Окно Solution Explorer

А файл Circle.cs выглядит следующим образом:

using System;

namespace ConsoleApplication1

{

public class Circle

{

public Circle()

{

//

// TODO: Add constructor logic here

//

}

}

}

3. Замените namespace ConsoleApplication1 на namespace MyProgram, для того чтобы идентификаторы файлов Program.cs и Circle.cs были определены в одном пространстве имен.

4. Перенесите класс Circle из файла Program.cs в файл Circle.cs.

5. Теперь запустите программу и посмотрите, что она делает.\

Контрольные вопросы:

1. Понятие класса. Разделы класса. Примеры описания класса.

2. В чем состоит различие между классом и объектом?

3. Как определяется класс?

4. Собственные копии чего имеет каждый объект?

5. Методы класса. Объявление и определение методов.

6. Какое имя имеет конструктор?

7. Какие функции выполняет оператор new?

8. Что такое «сборка мусора»? Как эта операция выполняется? Что такое деструктор?

9. Объясните предназначение ключевого слона this?






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.