Страница 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 >= 0 & index < 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 < fs.Length + 1; i++) {</b>
<b> fs[i] = i * 10; </b>
<b> if(fs.Error)</b>