Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
// Пример динамического построения значений,
// возвращаемых по очереди с помощью итератора.
using System;
using System.Collections;
class MyClass {
char ch = 'A';
// Этот итератор возвращает буквы английского
// алфавита, набранные в верхнем регистре.
public IEnumerator GetEnumerator() {
for (int i = 0; i < 26; i++)
yield return (char)(ch + i);
}
}
class ItrDemo2 {
static void Main() {
MyClass me = new MyClass();
foreach (char ch in me)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Вот к какому результату приводит выполнение этой программы.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Для преждевременного прерывания итератора служит следующая форма оператора yield
.
yield break;
Когда этот оператор выполняется, итератор уведомляет о том, что достигнут конец коллекции. А это, по существу, останавливает сам итератор.
Приведенная ниже программа является версией предыдущей программы, измененной с целью отобразить только первые десять букв английского алфавита.
// Пример прерывания итератора.
using System;
using System.Collections;
class MyClass {
char ch = 'A';
// Этот итератор возвращает первые 10 букв английского алфавита,
public IEnumerator GetEnumerator() {
for (int i = 0; i < 26; i++) {
if (i == 10) yield break; // прервать итератор преждевременно
yield return (char)(ch + i);
}
}
}
class ItrDemo3 {
static void Main() {
MyClass mc = new MyClass();
foreach (char ch in mc)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Эта программа дает следующий результат.
A B C D E F G H I J
В итераторе допускается применение нескольких операторов yield
. Но каждый такой оператор должен возвращать следующий элемент в коллекции. В качестве примера рассмотрим следующую программу.
// Пример применения нескольких операторов yield.
using System;
using System.Collections;
class MyClass {
// Этот итератор возвращает буквы А, В, С, D и Е.
public IEnumerator GetEnumerator() {
yield return 'A';
yield return 'B';
yield return 'C';
yield return 'D';
yield return 'E';
}
}
class ItrDemo5 {
static void Main() {
MyClass mc = new MyClass();
foreach (char ch in mc)
Console.Write(ch + " ");
Console.WriteLine();
}
}
Ниже приведен результата выполнения этой программы.
А В С D Е
В данной программе внутри метода GetEnumerator()
выполняются пять операторов yield
. Следует особо подчеркнуть, что они выполняются по очереди и каждый раз, когда из коллекции получается очередной элемент. Таким образом, на каждом шаге цикла foreach
в методе Main()
возвращается только один символ.
В приведенных выше примерах был продемонстрирован простейший способ реализации итератора. Но ему имеется альтернатива в виде именованного итератора. В данном случае создается метод, оператор или аксессор, возвращающий ссылку на
объект типа IEnumerable
. Именно этот объект используется в коде для предоставления итератора. Именованный итератор представляет собой метод, общая форма которого приведена ниже:
public IEnumerable имя_итератора (список_параметров) {
// ...
yield return obj;
}
где имя_итератора обозначает конкретное имя метода; список_параметров — от нуля до нескольких параметров, передаваемых методу итератора; obj — следующий объект, возвращаемый итератором. Как только именованный итератор будет создан, его можно использовать везде, где он требуется, например для управления циклом foreach
.
Именованные итераторы оказываются весьма полезными в некоторых ситуациях, поскольку они позволяют передавать аргументы итератору, управляющему процессом получения конкретных элементов из коллекции. Например, итератору можно передать начальный и конечный пределы совокупности элементов, возвращаемых из коллекции итератором. Эту форму итератора можно перегрузить, расширив ее функциональные возможности. В приведенном ниже примере программы демонстрируются два способа применения именованного итератора для получения элементов коллекции. В одном случае элементы перечисляются в заданных начальном и конечном пределах, а в другом — элементы перечисляются с начала последовательности и до указанного конечного предела.
// Использовать именованные итераторы.
using System;
using System.Collections;
class MyClass {
char ch = 'A';
// Этот итератор возвращает буквы английского алфавита,
// начиная с буквы А и кончая указанным конечным пределом
public IEnumerable MyItr(int end) {
for (int i = 0; i < end; i++)
yield return (char)(ch + i);
}
// Этот итератор возвращает буквы в заданных пределах
public IEnumerable MyItr(int begin, int end) {
for (int i = begin; i < end; i++)
yield return (char)(ch + i);
}
}
class ItrDemo4 {
static void Main() {
MyClass mc = new MyClass();
Console.WriteLine("Возвратить по очереди первые 7 букв:");
foreach (char ch in mc.MyItr(7))
Console.Write(ch + " ");
Console.WriteLine("\n");
Console.WriteLine("Возвратить по очереди буквы от F до L:");
foreach (char ch in mc.MyItr(5, 12))
Console.Write(ch + " ");
Console.WriteLine();
}
}
Эта программа дает следующий результат.
Возвратить по очереди первые 7 букв:
А В С D Е F G
Возвратить по очереди буквы от F до L:
F G Н I J К L
В приведенных выше примерах применялись необобщенные итераторы, но, конечно, ничто не мешает создать обобщенные итераторы. Для этого достаточно возвратить объект обобщенного типа IEnumerator
или IEnumerable
. Ниже приведен пример создания обобщенного итератора.
Интервал:
Закладка: