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

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

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

    return 0;

  }

}

Аксессор get предотвращает ошибки нарушения границ массива, проверяя в первую очередь, находится ли индекс в установленных границах. Эта проверка границ выполняется в методе ok(), который возвращает логическое значение true, если индекс правильный, а иначе — логическое значение false. Так, если указанный индекс находится в установленных границах, то по этому индексу возвращается соответствующий элемент. А если индекс оказывается вне установленных границ, то никаких операций не выполняется, но в то же время не возникает никаких ошибок переполнения. В данном варианте класса FailSoftArray переменная ErrFlag содержит результат каждой операции. Ее содержимое может быть проверено после каждой операции на предмет удачного или неудачного выполнения последней. (В главе 13 будет представлен более совершенный способ обработки ошибок с помощью имеющейся в C# подсистемы обработки исключительных ситуаций, а до тех пор можно вполне обойтись установкой и проверкой признака ошибки.)

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

set {

  if(ok(index) )    {

    a[index] = value;

    ErrFlag = false;

  }

  else ErrFlag = true;

}

Если параметр index метода ok() находится в установленных пределах, то соответствующему элементу массива присваивается значение, передаваемое из параметра value. В противном случае устанавливается логическое значение true переменной ErrFlag. Напомним, что value в любом аксессорном методе является неявным параметром, содержащим присваиваемое значение. Его не нужно (да и нельзя) объявлять отдельно.

Наличие обоих аксессоров, get и set, в индексаторе не является обязательным. Так, можно создать индексатор только для чтения, реализовав в нем один лишь аксессор get, или же индексатор только для записи с единственным аксессором set.

Перегрузка индексаторов

Индексатор может быть перегружен. В этом случае для выполнения выбирается тот вариант индексатора, в котором точнее соблюдается соответствие его параметра и аргумента, указываемого в качестве индекса. Ниже приведен пример программы, в которой индексатор массива класса FailSoftArray перегружается для индексов типа double. При этом индексатор типа double округляет свой индекс до ближайшего целого значения.

// Перегрузить индексатор массива класса FailSoftArray.

using System;

class FailSoftArray {

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

  public int Length; //открытая переменная длины массива

  public bool ErrFlag; // обозначает результат последней операции

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

  public FailSoftArray(int size) {

    a = new int[size];

    Length = size;

  }

  // Это индексатор типа int для массива FailSoftArray.

  public int this[int index] {

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

    get {

      if(ok(index)) {

        ErrFlag = false;

        return a[index];

      }

      else

      {

        ErrFlag = true;

        return 0;

      }

    }

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

    set {

      if(ok(index)) {

        a[index] = value;

        ErrFlag = false;

      }

      else

        ErrFlag = true;

    }

  }

  /* Это еще один индексатор для массива FailSoftArray. Он округляет свой аргумент до ближайшего целого индекса. */

  public int this[double idx] {

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

    get {

      int index;

      // Округлить до ближайшего целого.

      if((idx - (int) idx) < 0.5) index = (int) idx;

      else index = (int) idx + 1;

      if(ok(index)) {

        ErrFlag = false;

        return a[index];

      }

      else

      {

        ErrFlag = true;

        return 0;

      }

    }

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

    set {

      int index;

      // Округлить до ближайшего целого.

      if( (idx - (int) idx) < 0.5) index = (int) idx;

      else index = (int) idx + 1;

      if (ok (index) ) {

        a[index] = value;

        ErrFlag = false;

      }

      else

        ErrFlag = true;

    }

  }

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

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

  private bool ok(int index) {

    if(index >= 0 & index < Length) return true;

    return false;

  }

}

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

class FSDemo {

  static void Main() {

    FailSoftArray fs = new FailSoftArray(5);

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

    for(int i=0; i < fs.Length; i++) fs[i] = i;

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

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

    Console.WriteLine("fs[1]: " + fs[1]);

    Console.WriteLine("fs[2]: " + fs[2]);

    Console.WriteLine("fs[1.1]: " + fs[1.1]);

    Console.WriteLine("fs[1.6]: " + fs[1.6]);

  }

}

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

fs[1] : 1

fs[2] : 2

fs[1.1] : 1

fs[1.6] : 2

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

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

Индексаторы без базового массива

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

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

using System;

class PwrOfTwo {

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

  public int this[int index] {

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

    get {

      if((index >= 0) && (index < 16))

        return pwr(index);

      else

        return -1;

    }

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

  }

  int pwr(int p) {

    int result = 1;

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

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

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


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

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


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

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

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


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