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

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

<b>    RangeArray ra2 = new RangeArray(1, 10);</b>

<b>    RangeArray ra3 = new RangeArray(-20, -12);</b>

<b>    // Использовать объект ra в качестве массива.</b>

<b>    Console.WriteLine(&quot;Длина массива ra: &quot; + ra.Length);</b>

<b>    for (int i = -5; i &lt;= 5; i++) ra[i] = i;</b>

<b>    Console.Write(&quot;Содержимое массива ra: &quot;);</b>

<b>    for (int i = -5; i &lt;= 5; i++)</b>

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

<b>    Console.WriteLine(&quot;n&quot;);</b>

<b>    // Использовать объект ra2 в качестве массива.</b>

<b>    Console.WriteLine(&quot;Длина массива га2: &quot; + ra2.Length);</b>

<b>    for (int i = 1; i &lt;= 10; i++) ra2[i] = i;</b>

<b>    Console.Write(&quot;Содержимое массива ra2: &quot;);</b>

<b>    for (int i = 1; i &lt;= 10; i++)</b>

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

<b>    Console.WriteLine(&quot;n&quot;);</b>

<b>    // Использовать объект ra3 в качестве массива.</b>

<b>    Console.WriteLine(&quot;Длина массива ra3: &quot; + ra3.Length);</b>

<b>    for (int i = -20; i &lt;= -12; i++) ra3[i] = i;</b>

<b>    Console.Write(&quot;Содержимое массива ra3: &quot;);</b>

<b>    for (int i = -20; i &lt;= -12; i++)</b>

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

<b>    Console.WriteLine(&quot;n&quot;);</b>

<b>  }</b>

<b>}</b>

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

<b>Длина массива rа: 11</b>

<b>Содержимое массива rа: -5 -4 -3 -2 -1 0 1 2 3 4 5 </b>

<b>Длина массива rа2: 10</b>

<b>Содержимое массива rа2: 1 2 3 4 5 6 7 8 9 10 </b>

<b>Длина массива rа3: 9</b>

<b>Содержимое массива ra3: -20 -19 -18 -17 -16 -15 -14 -13 -12</b>

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

В начале класса RangeArray объявляются следующие закрытые переменные экземпляра.

<b>// Закрытые данные.</b>

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

<b>int lowerBound; // наименьший индекс </b>

<b>int upperBound; // наибольший индекс</b>

Переменная а служит для обращения к базовому массиву по ссылке. Память для него распределяется конструктором класса RangeArray. Нижняя граница индексирования массива хранится в переменной lowerBound, а верхняя граница — в переменной upperBound.

Далее объявляются автоматически реализуемые свойства Length и Error.

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

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

<b>public int Length { get; private set; }</b>

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

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

<b>public bool Error { get; private set; }</b>

Обратите внимание на то, что в обоих свойства аксессор set обозначен как private. Как пояснялось выше, такое объявление автоматически реализуемого свойства, по существу, делает его доступным только для чтения.

Ниже приведен конструктор класса RangeArray.

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

<b>public RangeArray(int low, int high) { </b>

<b>  high++;</b>

<b>  if(high &lt;= low) {</b>

<b>    Console.WriteLine(&quot;Неверные индексы&quot;);</b>

<b>    high = 1; // создать для надежности минимально допустимый массив</b>

<b>    low = 0;</b>

<b>  }</b>

<b>  а = new int[high - low];</b>

<b>  Length = high - low;</b>

<b>  lowerBound = low; </b>

<b>  upperBound = --high;</b>

<b>}</b>

При конструировании объекту класса RangeArray передается нижняя граница массива в качестве параметра low, а верхняя граница — в качестве параметра high. Затем значение параметра high инкрементируется, поскольку пределы индексирования массива изменяются от low до high включительно. Далее выполняется следующая проверка: является ли верхний индекс больше нижнего индекса. Если это не так, то выдается сообщение об ошибке и создается массив, состоящий из одного элемента. После этого для массива распределяется память, а ссылка на него присваивается переменной а. Затем свойство Length устанавливается равным числу элементов массива. И наконец, устанавливаются переменные lowerBound и upperBound.