Добавить в цитаты Настройки чтения

Страница 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 &gt;= 0 &amp; index &lt; 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 &lt; fs.Length + 1; i++) {</b>

<b>      fs[i] = i * 10; </b>

<b>      if(fs.Error)</b>

<b>        Console.WriteLine(&quot;Ошибка в индексе &quot; + i);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Этот вариант класса FailSoftArray действует таким же образом, как и предыдущий, но в нем отсутствуют поддерживающие поля, объявляемые явно.

На применение модификаторов доступа в аксессорах накладываются следующие ограничения. Во-первых, действию модификатора доступа подлежит только один аксессор: set или get, но не оба сразу. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе. (Подробнее об интерфейсах речь пойдет в главе 12.)

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

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