Применение индексаторов и свойств



 

В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса RangeArray, в котором индексаторы и свойства используются для создания типа массива с пределами индексирования, определяемыми пользователем.

Как вам должно быть уже известно, индексирование всех массивов в C# начинается с нуля. Но в некоторых приложениях индексирование массива удобнее начинать с любой произвольной точки отсчета: с 1 или даже с отрицательного числа, например от -5 и до 5. Рассматриваемый здесь класс RangeArray разработан таким образом, чтобы допускать подобного рода индексирование массивов.

Используя класс RangeArray, можно написать следующий фрагмент кода.

 

RangeArray ra = new RangeArray(-5, 10); // массив с индексами от -5 до 10  

for(int i=-5; i <= 10; i++) ra[i] = i; // индексирование массива от -5 до 10

 

Нетрудно догадаться, что в первой строке этого кода конструируется объект класса RangeArray с пределами индексирования массива от -5 до 10 включительно. Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект ra будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10.

Ниже приведен полностью класс RangeArray вместе с классом RangeArrayDemo, в котором демонстрируется индексирование массива в заданных пределах. Класс RangeArray реализован таким образом, чтобы поддерживать массивы типа int, но при желании вы можете изменить этот тип на любой другой.

 

/* Создать класс со специально указываемыми пределами индексирования массива. Класс RangeArray допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса RangeArray указываются начальный и конечный индексы. Допускается также указывать отрицательные индексы. Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */

using System;

class RangeArray {

Закрытые данные.

int[] a; // ссылка на базовый массив  

int lowerBound; // наименьший индекс int  

Int upperBound; // наибольший индекс

 

// Автоматически реализуемое и доступное  

//только для чтения свойство Length,  

public int Length { get; private set; }

 

// Автоматически реализуемое и доступное  

//только для чтения свойство Error,  

public bool Error { get; private set; }

 

// Построить массив по заданному размеру,  

public RangeArray(int low, int high) {

high++;

if (high <= low) {

Console.WriteLine("Неверные индексы");

high = 1; // создать для надежности минимально допустимый массив  

low = 0;

}

a = new int[high - low];

Length = high - low;

lowerBound = low;

upperBound = --high;

}

 

// Это индексатор для класса RangeArray.  

public int this[int index] {

// Это аксессор get.  

get {

if (ok(index)) {

Error = false;

return a[index - lowerBound];

}

else {

Error = true;

return 0;

}

}

// Это аксессор set.  

set {

if (ok(index)) {

a[index - lowerBound] = value;

Error = false;

}

Else

Error = true;

}

}

 

// Возвратить логическое значение true, если  

// индекс находится в установленных границах,  

private bool ok(int index) {

if (index >= lowerBound & index <= upperBound) return true;

return false;

}

}

 

// Продемонстрировать применение массива с произвольно  

// задаваемыми пределами индексирования,  

class RangeArrayDemo {

static void Main() {

RangeArray ra = new RangeArray(-5, 5);

RangeArray ra2 = new RangeArray(1, 10);

RangeArray ra3 = new RangeArray(-20, -12);

 

Использовать объект ra в качестве массива.

Console.WriteLine("Длина массива ra: " + ra.Length);

for (int i = -5; i <= 5; i++) ra[i] = i;

 

Console.Write("Содержимое массива ra: ");

for (int i = -5; i <= 5; i++)

Console.Write(ra[i] + " ");

 

Console.WriteLine("\n");

 

Использовать объект ra2 в качестве массива.

Console.WriteLine("Длина массива га2: " + ra2.Length);

for (int i = 1; i <= 10; i++) ra2[i] = i;

 

Console.Write("Содержимое массива ra2: ");

for (int i = 1; i <= 10; i++)

Console.Write(ra2[i] + " ");

 

Console.WriteLine("\n");

 

Использовать объект ra3 в качестве массива.

Console.WriteLine("Длина массива ra3: " + ra3.Length);

for (int i = -20; i <= -12; i++) ra3[i] = i;

 

Console.Write("Содержимое массива ra3: ");

for (int i = -20; i <= -12; i++)

Console.Write(ra3[i] + " ");

 

Console.WriteLine("\n");

}

}

 

При выполнении этого кода получается следующий результат.

 

Длина массива rа: 11

Содержимое массива rа: -5 -4 -3 -2 -1 0 1 2 3 4 5  

 

Длина массива rа2: 10

Содержимое массива rа2: 1 2 3 4 5 6 7 8 9 10  

 

Длина массива rа3: 9


Дата добавления: 2019-02-12; просмотров: 318; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!