Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ОСиСП.doc
Скачиваний:
68
Добавлен:
11.05.2015
Размер:
1.78 Mб
Скачать

Преимущества использования общих типов

Наиболее очевидное - повторное использование кода. Нет необходимости создавать два идентичных класса, отличающихся только типами параметров, достаточно создать один с параметризованными типами. При этом использование параметризованных типов позволяет создавать единый программный код для работы с различными типами данных. Например, единожды написанный алгоритм может работать и с целыми числами и с числами с плавающей десятичной точкой, при этом не производя на каждом шаге проверку/приведение типа. Так Generics вытесняют классы объявленные с использованием типа object.

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

Проверка типов в момент компиляции программы. Поскольку не используются параметры типа object, то компилятор может выполнить проверку типа каждого параметра в момент компиляции, поскольку типы для Generic классов жестко задаются в момент объявления переменных классов этого типа.

Общие типы не соответствуют шаблонам в C++, поскольку параметризованные типы в C# не могут иметь типов по умолчанию. Параметризованные типы не могут быть использованы в качестве базовых классов для общих типов. Также в C# не допускается использования Generic классов в качестве параметров типов в других Generic классах.

29. Итераторы в среде .Net. Создание и использование итераторов.

Итератор — метод доступа get или оператор, выполняющий настраиваемую итерацию класса массива или коллекции с помощью ключевого слова yield. При использовании оператора return ключевого слова yield элемент в исходной последовательности немедленно возвращается вызывающему объекту до того, как будет получен доступ к следующему элементу. Хотя итератор создается как метод, компилятор переводит его во вложенный класс, который фактически является конечным автоматом. Данный класс отслеживает положения итератора, пока в клиентском коде выполняется цикл foreach.

Итератор вызывается из клиентского кода с помощью оператора foreach. Например, можно создать итератор для класса, возвращающего элементы в обратном порядке или выполняющего операцию над каждым элементом перед тем, как итератор возвратит его. При создании итератора для класса или структуры реализация всего интерфейса IEnumerator не требуется. Когда компилятор обнаруживает итератор, он автоматически создает методы Current, MoveNext и Dispose интерфейса IEnumerator или IEnumerator<T>.

Общие сведения о итераторах

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

  2. Итератор может использоваться в качестве основной части метода, оператора или метода доступа get.

  3. В коде итератора используется оператор yield return для возвращения каждого элемента по очереди. Ключевое слово yield break завершает итерацию.

  4. В классе можно реализовать несколько итераторов. Каждый итератор должен иметь уникальное имя, как и любой член класса, и может вызываться клиентским кодом в операторе foreach: foreach(int x in SampleClass.Iterator2){}.

  5. Тип возвращаемого итератором значения должен быть IEnumerable,IEnumerator,IEnumerable<T> илиIEnumerator<T>.

  6. Итераторы используются для обеспечения отложенного выполнения в запросах LINQ.

Ключевое слово yield используется для указания возвращаемого значения или значений. При подходе к оператору yield return текущее положение сохраняется. При следующем вызове итератора выполнение возобновляется с этого места.

Итераторы также удобно использовать с классами коллекций, так как это обеспечивает простой способ итерации сложных структур данных, например двоичных деревьев.

class TestDaysOfTheWeek

{

static void Main()

{

// Create an instance of the collection class

DaysOfTheWeek week = new DaysOfTheWeek();

// Iterate with foreach

foreach (string day in week)

{

System.Console.Write(day + " ");

}

}

}

// Output: Sun Mon Tue Wed Thr Fri Sat