Kniga-Online.club
» » » » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

Читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Используя класс RangeArray, можно написать следующий фрагмент кода.

RangeArray ra = new RangeArray(-5, 10); // массив с индексами от -5 до 10

for(int i=-5; i <= 10; i++) ra[i] = i; // индексирование массива от -5 до 10

Нетрудно догадаться, что в первой строке этого кода конструируется объект класса RangeArray с пределами индексирования массива от -5 до 10 включительно. Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект ra будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10.

Ниже приведен полностью класс RangeArray вместе с классом RangeArrayDemo, в котором демонстрируется индексирование массива в заданных пределах. Класс RangeArray реализован таким образом, чтобы поддерживать массивы типа int, но при желании вы можете изменить этот тип на любой другой.

/* Создать класс со специально указываемыми пределами индексирования массива. Класс RangeArray допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса RangeArray указываются начальный и конечный индексы. Допускается также указывать отрицательные индексы. Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */

using System;

class RangeArray {

  // Закрытые данные.

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

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

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

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

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

  public int Length { get; private set; }

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

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

  public bool Error { get; private set; }

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

  public RangeArray(int low, int high) {

    high++;

    if (high <= low) {

      Console.WriteLine("Неверные индексы");

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

      low = 0;

    }

    a = new int[high - low];

    Length = high - low;

    lowerBound = low;

    upperBound = --high;

  }

  // Это индексатор для класса RangeArray.

  public int this[int index] {

    // Это аксессор get.

    get {

      if (ok(index)) {

        Error = false;

        return a[index - lowerBound];

      }

      else {

        Error = true;

        return 0;

      }

    }

    // Это аксессор set.

    set {

      if (ok(index)) {

        a[index - lowerBound] = value;

        Error = false;

      }

      else

        Error = true;

    }

  }

  // Возвратить логическое значение true, если

  // индекс находится в установленных границах,

  private bool ok(int index) {

    if (index >= lowerBound & index <= upperBound) return true;

    return false;

  }

}

// Продемонстрировать применение массива с произвольно

// задаваемыми пределами индексирования,

class RangeArrayDemo {

  static void Main() {

    RangeArray ra = new RangeArray(-5, 5);

    RangeArray ra2 = new RangeArray(1, 10);

    RangeArray ra3 = new RangeArray(-20, -12);

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

    Console.WriteLine("Длина массива ra: " + ra.Length);

    for (int i = -5; i <= 5; i++) ra[i] = i;

    Console.Write("Содержимое массива ra: ");

    for (int i = -5; i <= 5; i++)

      Console.Write(ra[i] + " ");

    Console.WriteLine("n");

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

    Console.WriteLine("Длина массива га2: " + ra2.Length);

    for (int i = 1; i <= 10; i++) ra2[i] = i;

    Console.Write("Содержимое массива ra2: ");

    for (int i = 1; i <= 10; i++)

      Console.Write(ra2[i] + " ");

    Console.WriteLine("n");

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

    Console.WriteLine("Длина массива ra3: " + ra3.Length);

    for (int i = -20; i <= -12; i++) ra3[i] = i;

    Console.Write("Содержимое массива ra3: ");

    for (int i = -20; i <= -12; i++)

      Console.Write(ra3[i] + " ");

    Console.WriteLine("n");

  }

}

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

Длина массива rа: 11

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

Длина массива rа2: 10

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

Длина массива rа3: 9

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

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

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

// Закрытые данные.

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

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

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

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

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

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

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

public int Length { get; private set; }

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

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

public bool Error { get; private set; }

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

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

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

public RangeArray(int low, int high) {

  high++;

  if(high <= low) {

    Console.WriteLine("Неверные индексы");

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

    low = 0;

  }

  а = new int[high - low];

  Length = high - low;

  lowerBound = low;

  upperBound = --high;

}

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

Перейти на страницу:

Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


C# 4.0: полное руководство отзывы

Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*