public bool Error { get; private set; }
Благодаря этому свойство Errorстановится доступным для чтения, но не для установки за пределами класса FailSoftArray.
Для опробования автоматически реализуемых вариантов свойств Lengthи Errorв классе FailSoftArrayудалим сначала переменные lenи ErrFlag, поскольку они больше не нужны, а затем заменим каждое применение переменных lenи ErrFlagсвойствами Lengthи Errorв классе FailSoftArray. Ниже приведен обновленный вариант класса FailSoftArrayвместе с методом Main(),демонстрирующим его применение.
// Применить автоматически реализуемые и доступные
// только для чтения свойства 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, но не оба сразу. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе. (Подробнее об интерфейсах речь пойдет в главе 12.)
Применение индексаторов и свойств
В предыдущих примерах программ был продемонстрирован основной принцип действия индексаторов и свойств, но их возможности не были раскрыты в полную силу. Поэтому в завершение этой главы обратимся к примеру класса 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
Читать дальше