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

Страница 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 &gt;= 0 &amp; index1 &lt; rows &amp; index2 &gt;= 0 &amp;</b>

<b>           index2 &lt; 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(&quot;Скрытый сбой.&quot;); </b>

<b>    for (int i=0; i &lt; 6; i++) fs[i, i]=i*10;</b>

<b>    for(int i=0; i &lt; 6; i++) {</b>

<b>      x = fs[i, i] ;</b>

<b>      if(x != -1) Console.Write (x + &quot; &quot;);</b>

<b>    }</b>

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

<b>    // А теперь показать сбои.</b>

<b>    Console.WriteLine(&quot;nСбой с уведомлением об ошибках.&quot;); </b>

<b>    for(int i=0; i &lt; 6; i++) {</b>

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

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

<b>        Console.WriteLine(&quot;fs[&quot; + i + &quot;, &quot; + i + &quot;] вне границ&quot;);</b>

<b>    }</b>

<b>    for(int i=0; i &lt; 6; i++) {</b>

<b>      x = fs[i, i] ;</b>

<b>      if(!fs.ErrFlag) </b>

<b>        Console.Write(x + &quot; &quot;);</b>

<b>      else</b>

<b>        Console.WriteLine(&quot;fs[&quot; + i + &quot;, &quot; + i + &quot;] вне границ&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Вот к какому результату приводит выполнение этого кода:

<b>Скрытый сбой.</b>

<b>0 10 20 0 0 0</b>