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