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

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

<b>  static void Main() {</b>

<b>    FailSoftArray fs = new FailSoftArray(5);</b>

<b>    // Поместить ряд значений в массив fs. </b>

<b>    for(int i=0; i &lt; fs.Length; i++) fs[i] = i;</b>

<b>    // А теперь воспользоваться индексами </b>

<b>    // типа int и double для обращения к массиву.</b>

<b>    Console.WriteLine(&quot;fs[1]: &quot; + fs[1]);</b>

<b>    Console.WriteLine(&quot;fs[2]: &quot; + fs[2]);</b>

<b>    Console.WriteLine(&quot;fs[1.1]: &quot; + fs[1.1]);</b>

<b>    Console.WriteLine(&quot;fs[1.6]: &quot; + fs[1.6]);</b>

<b>  }</b>

<b>}</b>

При выполнении этой программы получается следующий результат.

<b>fs[1] : 1 </b>

<b>fs[2] : 2 </b>

<b>fs[1.1] : 1 </b>

<b>fs[1.6] : 2 </b>

Как показывает приведенный выше результат, индексы типа double округляются до ближайшего целого значения. В частности, индекс 1.1 округляется до 1, а индекс 1.6 — до 2.

Представленный выше пример программы наглядно демонстрирует правомочность перегрузки индексаторов, но на практике она применяется нечасто. Как правило, индексаторы перегружаются для того, чтобы использовать объект определенного класса в качестве индекса, вычисляемого каким-то особым образом.

Следует особо подчеркнуть, что индексатор совсем не обязательно должен оперировать массивом. Его основное назначение — предоставить пользователю функциональные возможности, аналогичные массиву. В качестве примера в приведенной ниже программе демонстрируется индексатор, выполняющий роль массива только для чтения, содержащего степени числа 2 от 0 до 15. Обратите внимание на то, что в этой программе отсутствует конкретный массив. Вместо этого индексатор просто вычисляет подходящее значение для заданного индекса.

<b>// Индексаторы совсем не обязательно должны оперировать отдельными массивами.</b>

<b>using System;</b>

<b>class PwrOfTwo {</b>

<b>  /* Доступ к логическому массиву, содержащему степени числа 2 от 0 до 15. */ </b>

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

<b>    // Вычислить и возвратить степень числа 2. </b>

<b>    get {</b>

<b>      if((index &gt;= 0) &amp;&amp; (index &lt; 16)) </b>

<b>        return pwr(index);</b>

<b>      else </b>

<b>        return -1;</b>

<b>    }</b>

<b>    // Аксессор set отсутствует.</b>

<b>  }</b>

<b>  int pwr(int p) { </b>

<b>    int result = 1;</b>

<b>    for(int i=0; i &lt; p; i++) result *= 2;</b>

<b>    return result;</b>

<b>  }</b>

<b>}</b>

<b>class UsePwrOfTwo { </b>

<b>  static void Main() {</b>

<b>    PwrOfTwo pwr = new PwrOfTwo();</b>

<b>    Console.Write(&quot;Первые 8 степеней числа 2: &quot;); </b>

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

<b>      Console.Write(pwr[i] + &quot; &quot;);</b>

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

<b>    Console.Write(&quot;А это некоторые ошибки: &quot;);</b>

<b>    Console.Write(pwr[-1] + &quot; &quot; + pwr[17]);</b>

<div class="fb2-code"><code>&lt;b&gt;    Console.WriteLine();&lt;/b&gt;</code></div>

<b>  }</b>

<b>}</b>

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

<b>Первые 8 степеней числа 2: 1 2 4 8 16 32 64 128 </b>

<b>А это некоторые ошибки: -1 -1</b>

Обратите внимание на то, что в индексатор класса PwrOfTwo включен только аксессор get, но в нем отсутствует аксессор set. Как пояснялось выше, такой индексатор служит только для чтения. Следовательно, объект класса PwrOfTwo может указываться только в правой части оператора присваивания, но не в левой его части. Например, попытка ввести следующую строку кода в приведенную выше программу не приведет к желаемому результату.

<b>pwr[0] =11; //не подлежит компиляции</b>

Такой оператор присваивания станет причиной появления ошибки во время компиляции, поскольку для индексатора не определен аксессор set.

На применение индексаторов накладываются два существенных ограничения. Во-первых, значение, выдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out, поскольку в индексаторе не определено место в памяти для его хранения. И во-вторых, индексатор должен быть членом своего класса и поэтому не может быть объявлен как static.