Применение индексаторов и свойств
В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!