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

Страница 141 из 502

<b>    }</b>

<b>    Console.WriteLine();</b>

<b>    // fs.Length = 10; // Ошибка, запись запрещена!</b>

<b>  }</b>

<b>}</b>

Теперь Length — это свойство, в котором местом для хранения данных служит закрытая переменная lеn. А поскольку в этом свойстве определен единственный аксессор get, то оно доступно только для чтения. Это означает, что значение свойства Length можно только читать, но не изменять. Для того чтобы убедиться в этом, попробуйте удалить символы комментария в начале следующей строки из приведенного выше кода.

<b>// fs.Length =10; // Ошибка, запись запрещена!</b>

При попытке скомпилировать данный код вы получите сообщение об ошибке, уведомляющее о том, что Length является свойством, доступным только для чтения.

Добавлением свойства Length в класс FailSoftArray усовершенствование рассматриваемого здесь примера кода с помощью свойств далеко не исчерпывается. Еще одним членом данного класса, подходящим для превращения в свойство, служит переменная ErrFlag, поскольку ее применение должно быть ограничено только чтением. Ниже приведен окончательно усовершенствованный вариант класса FailSoftArray, в котором создается свойство Error, использующее в качестве места для хранения данных исходную переменную ErrFlag, ставшую теперь закрытой.

<b>// Превратить переменную ErrFlag в свойство.</b>

<b>using System;</b>

<b>class FailSoftArray {</b>

<b>  int[] a; // ссылка на базовый массив </b>

<b>  int len; // длина массива</b>

<b>  bool ErrFlag; // теперь это частная переменная,</b>

<b>  // обозначающая результат последней операции</b>

<b>  // Построить массив заданного размера, </b>

<b>  public FailSoftArray(int size) { </b>

<b>    a = new int[size]; </b>

<b>    len = size;</b>

<b>  }</b>

<b>  // Свойство Length только для чтения, </b>

<b>  public int Length { </b>

<b>    get {</b>

<b>      return len;</b>

<b>    }</b>

<b>  }</b>

<b>  // Свойство Error только для чтения, </b>

<b>  public bool Error { </b>

<b>    get {</b>

<b>      return ErrFlag;</b>

<b>    }</b>

<b>  }</b>

<b>  // Это индексатор для класса FailSoftArray. </b>

<b>  public int this[int index] {</b>

<b>    // Это аксессор get. </b>

<b>    get {</b>

<b>      if(ok(index)) {</b>

<b>        ErrFlag = false; </b>

<b>        return a[index];</b>

<b>      } </b>

<b>      else {</b>

<b>        ErrFlag = 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>        ErrFlag = false;</b>

<b>      }</b>

<b>      else </b>

<b>        ErrFlag = 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>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>