Читать книги » Книги » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

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

Читать книгу Герберт Шилдт - C# 4.0: полное руководство, Герберт Шилдт . Жанр: Программирование.
Герберт Шилдт - C# 4.0: полное руководство
Название: C# 4.0: полное руководство
ISBN: -
Год: -
Дата добавления: 3 июль 2019
Количество просмотров: 572
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

C# 4.0: полное руководство читать книгу онлайн

C# 4.0: полное руководство - читать онлайн , автор Герберт Шилдт
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
1 ... 78 79 80 81 82 ... 294 ВПЕРЕД
Перейти на страницу:

    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;

1 ... 78 79 80 81 82 ... 294 ВПЕРЕД
Перейти на страницу:
Комментарии (0)