C# 4.0 полное руководство - 2011
Шрифт:
public bool Error { get; private set; }
Благодаря этому свойство Error становится доступным для чтения, но не для установки за пределами класса FailSoftArray.
Для опробования автоматически реализуемых вариантов свойств Length и Error в классе FailSoftArray удалим сначала переменные len и ErrFlag, поскольку они больше не нужны, а затем заменим каждое применение переменных len и ErrFlag свойствами Length и Error в
// 'Применить автоматически реализуемые и доступные // только для чтения свойства Length и Error.
using System;
class FailSoftArray {
int[] a; // ссылка на базовый массив
// Построить массив по заданному размеру, public FailSoftArray(int size) { a = new int [size];
Length = size;
}
// Автоматически реализуемое и доступное только для чтения свойство Length, public int Length { get; private set; }
// Автоматически реализуемое и доступное только для чтения свойство Error, public bool Error { get; private set; }
// Это индексатор для массива FailSoftArray. public int this[int index] {
// Это аксессор get. get {
if(ok(index) ) {
Error = false; return a[index];
} else {
Error "= true; return 0;
}
}
// Это аксессор set. set {
if(ok(index)) {
a[index] = value;
Error = false;
}
else Error = true;
}
}
// Возвратить логическое значение true, если // индекс находится в установленных границах, private bool ok(int index) {
if(index >= 0 & index < Length) return true; return false;
}
}
// Продемонстрировать применение усовершенствованного // отказоустойчивого массива, class FinalFSDemo { static void Main {
FailSoftArray fs = new FailSoftArray(5);
// Использовать свойство Error, for(int i=0; i < fs.Length + 1; i++) {
fs[i] = i * 10; if(fs.Error)
Console.WriteLine("Ошибка в индексе " + i);
}
}
}
Этот вариант класса FailSoftArray действует таким же образом, как и предыдущий, но в нем отсутствуют поддерживающие поля, объявляемые явно.
На применение модификаторов доступа в аксессорах накладываются следующие ограничения. Во-первых, действию модификатора доступа подлежит только один аксессор: set или get, но
Применение индексаторов и свойств
В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса RangeArray, в котором индексаторы и свойства используются для создания типа массива с пределами индексирования, определяемыми пользователем.
Как вам должно быть уже известно, индексирование всех массивов в C# начинается с нуля. Но в некоторых приложениях индексирование массива удобнее начинать с любой произвольной точки отсчета: с 1 или даже с отрицательного числа, например от -5 и до 5. Рассматриваемый здесь класс RangeArray разработан таким образом, чтобы допускать подобного рода индексирование массйвов.
Используя класс RangeArray, можно написать следующий фрагмент кода.
RangeArray га = new RangeArray(-5, 10); // массив'с индексами от -5 до 10 for(int i=-5; i <= 10; i++) ra[i] = i; // индексирование массива от -5 до
10
Нетрудно догадаться, что в первой строке этого кода конструируется объект класса RangeArray с пределами индексирования массива от – 5 до 10 включительно. Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект га будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10.
Ниже приведен полностью класс RangeArray вместе с классом RangeArrayDemo, в котором демонстрируется индексирование массива в заданных пределах. Класс RangeArray реализован таким образом, чтобы поддерживать массивы типа int, но при желании вы можете изменить этот тип на любой другой.
/* Создать класс со специально указываемыми пределами индексирования массива. Класс RangeArray допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса RangeArray указываются начальный и конечный индексы. Допускается также указывать отрицательные индексы. Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */
using System;
class RangeArray {
// Закрытые данные.
int[] а; // ссылка на базовый массив int lowerBound; // наименьший индекс int upperBound; // наибольший индекс
// Автоматически реализуемое и доступное только для чтения свойство Length, public int Length { get; private set; }
// Автоматически реализуемое и доступное только для чтения свойство Error, public bool Error { get; private set; }