Страница 138 из 502
Индексаторы можно создавать и для многомерных массивов. В качестве примера ниже приведен двумерный отказоустойчивый массив. Обратите особое внимание на объявление индексатора в этом примере.
<b>// Двумерный отказоустойчивый массив.</b>
<b>using System;</b>
<b>class FailSoftArray2D {</b>
<b> int[,] a; // ссылка на базовый двумерный массив </b>
<b> int rows, cols; // размеры массива</b>
<b> public int Length; // открытая переменная длины массива </b>
<b> public bool ErrFlag; // обозначает результат последней операции</b>
<b> // Построить массив заданных размеров, </b>
<b> public FailSoftArray2D(int r, int с) { </b>
<b> rows = r; cols = с;</b>
<b> a = new int[rows, cols];</b>
<b> Length = rows * cols;</b>
<b> }</b>
<b> // Это индексатор для класса FailSoftArray2D. </b>
<b> public int this[int index1, int index2] {</b>
<b> // Это аксессор get. </b>
<b> get {</b>
<b> if(ok(index1, index2)) {</b>
<b> ErrFlag = false;</b>
<b> return a[index1, index2];</b>
<b> } </b>
<b> else </b>
<b> {</b>
<b> ErrFlag = true; </b>
<b> return 0;</b>
<b> }</b>
<b> }</b>
<b> // Это аксессор set. </b>
<b> set {</b>
<b> if(ok(index1, index2)) {</b>
<b> a[index1, index2] = 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 index1, int index2) {</b>
<b> if (index1 >= 0 & index1 < rows & index2 >= 0 &</b>
<b> index2 < cols) return true;</b>
<b> return false;</b>
<b> }</b>
<b>}</b>
<b>// Продемонстрировать применение двумерного индексатора, </b>
<b>class TwoDIndexerDemo { </b>
<b> static void Main() {</b>
<b> FailSoftArray2D fs = new FailSoftArray2D(3, 5); </b>
<b> int x;</b>
<b> // Выявить скрытые сбои.</b>
<b> Console.WriteLine("Скрытый сбой."); </b>
<b> for (int i=0; i < 6; i++) fs[i, i]=i*10;</b>
<b> for(int i=0; i < 6; i++) {</b>
<b> x = fs[i, i] ;</b>
<b> if(x != -1) Console.Write (x + " ");</b>
<b> }</b>
<b> Console.WriteLine();</b>
<b> // А теперь показать сбои.</b>
<b> Console.WriteLine("nСбой с уведомлением об ошибках."); </b>
<b> for(int i=0; i < 6; i++) {</b>
<b> fs[i,i] = i * 10; </b>
<b> if(fs.ErrFlag)</b>
<b> Console.WriteLine("fs[" + i + ", " + i + "] вне границ");</b>
<b> }</b>
<b> for(int i=0; i < 6; i++) {</b>
<b> x = fs[i, i] ;</b>
<b> if(!fs.ErrFlag) </b>
<b> Console.Write(x + " ");</b>
<b> else</b>
<b> Console.WriteLine("fs[" + i + ", " + i + "] вне границ");</b>
<b> }</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этого кода:
<b>Скрытый сбой.</b>
<b>0 10 20 0 0 0</b>