Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Äæîçåô Àëáàõàðè Áåí Àëáàõàðè
Ñàíêò-Ïåòåðáóðã
«ÁÕÂ-Ïåòåðáóðã»
2009
УДК 681.3.068+800.92С# ББК 32.973.26-018.1 А45
Албахари, Дж.
А45 C# 3.0. Справочник: Пер. с англ. / Дж. Албахари, Б. Албахари. — 3-е изд. — СПб.: БХВ-Петербург, 2009. — 944 с.: ил.
ISBN 978-5-9775-0245-0
Книга представляет собой подробный справочник по программированию на языке C# 3.0, реализованном в Microsoft Visual Studio 2008. Первые главы целиком посвяще-ны языку C#, начиная с основ синтаксиса, типов и переменных и заканчивая более сложными темами, такими как небезопасный код или препроцессорные директивы. В последующих главах рассмотрено ядро .NET 3.5 Framework, LINQ, XML, коллекции, ввод/вывод и работа в сети, управление памятью, рефлексия, атрибуты, безопасность, домены приложений и взаимодействие с небезопасным кодом. В отличие от предыду-щих изданий, материал книги наряду с теоретическими основами сопровождается на-глядными практическими примерами, что позволяет сочетать глубину изложения с лег-костью понимания.
Для программистов
УДК 681.3.068+800.92С# ББК 32.973.26-018.1
Группа подготовки издания:
Главный редактор Екатерина Кондукова
Зам. главного редактора Игорь Шишигин
Зав. редакцией Григорий Добин
Перевод с английского Сергея Иноземцева
Редактор Ирина Иноземцева
Компьютерная верстка Ольги Сергиенко
Корректор Зинаида Дмитриева
Оформление обложки Елены Беляевой
Зав. производством Николай Тверских
Authorized translation of the English edition of C# 3.0 in a Nutshell, 3E, ISBN: 978-0-596-52757-0, Copyright © 2007 O'Reilly Media, Inc. This translation is published and sold by permission of O'Reilly Media, Inc., the owner of all rights to publish and sell the same.
Авторизованный перевод английской редакции книги C# 3.0 in a Nutshell, 3E, ISBN: 978-0-596-52757-0, Copyright © 2007 O'Reilly Media, Inc. Перевод опубликован и продается с разрешения O'Reilly Media, Inc., собственника всех прав на публикацию и продажу издания.
Ëèöåíçèÿ ÈÄ ¹ 02429 îò 24.07.00. Ïîäïèñàíî â ïå÷àòü 30.06.09. Ôîðìàò 70×1001/16.
Ïå÷àòü îôñåòíàÿ. Óñë. ïå÷. ë. 76,11. Òèðàæ 2000 ýêç. Çàêàç ¹
"ÁÕÂ-Ïåòåðáóðã", 190005, Ñàíêò-Ïåòåðáóðã, Èçìàéëîâñêèé ïð., 29.
Ñàíèòàðíî-ýïèäåìèîëîãè÷åñêîå çàêëþ÷åíèå íà ïðîäóêöèþ ¹ 77.99.60.953.Ä.003650.04.08 îò 14.04.2008 ã. âûäàíî Ôåäåðàëüíîé ñëóæáîé
ïî íàäçîðó â ñôåðå çàùèòû ïðàâ ïîòðåáèòåëåé è áëàãîïîëó÷èÿ ÷åëîâåêà.
Îòïå÷àòàíî ñ ãîòîâûõ äèàïîçèòèâîâ â ÃÓÏ "Òèïîãðàôèÿ "Íàóêà"
199034, Ñàíêò-Ïåòåðáóðã, 9 ëèíèÿ, 12
ISBN 978-0-596-52757-0 (англ.) ISBN 978-5-9775-0245-0 (рус.)
© 2007 O'Reilly Media, Inc. © Перевод на русский язык "БХВ-Петербург", 2009
Îãëàâëåíèå
Об авторах ...................................................................................................................................... 1
Предисловие ................................................................................................................................... 3
Целевая аудитория ........................................................................................................................................... 3
Как организована эта книга ............................................................................................................................. 4
Что необходимо для чтения этой книги ......................................................................................................... 4
Соглашения, использованные в книге ............................................................................................................ 5
Использование фрагментов кода .................................................................................................................... 5
Благодарности .................................................................................................................................................. 6
Глава 1. Введение в C# и .NET Framework ............................................................................... 9
Объектная ориентированность ....................................................................................................................... 9
Безопасность типов ........................................................................................................................................ 10
Управление памятью...................................................................................................................................... 10
Работа на разных платформах ....................................................................................................................... 11
Язык C# и среда CLR ..................................................................................................................................... 11
Среда CLR и платформа .NET Framework ................................................................................................... 11
Что нового в C# 3.0 ........................................................................................................................................ 13
Глава 2. Основы языка C# ......................................................................................................... 17
Первая программа на C# ................................................................................................................................ 17
Компиляция ........................................................................................................................................... 19
Синтаксис ....................................................................................................................................................... 20
Идентификаторы и ключевые слова .................................................................................................... 20
Как избежать конфликтов .................................................................................................................... 21
Контекстные ключевые слова ............................................................................................................. 21
Литералы, пунктуаторы и знаки операций .......................................................................................... 21
Комментарии ......................................................................................................................................... 22
Основные сведения о типах........................................................................................................................... 22
Примеры стандартных типов................................................................................................................ 23
Примеры пользовательских типов ....................................................................................................... 23
Члены типа ............................................................................................................................................ 24
Сходство стандартных и пользовательских типов ............................................................................ 24
Конструкторы и создание экземпляров .............................................................................................. 24
Члены экземпляра и статические члены............................................................................................. 25
Ключевое слово public ......................................................................................................................... 26
Преобразование типов .......................................................................................................................... 26
Типы значений и ссылочные типы ....................................................................................................... 26
Типы значений ...................................................................................................................................... 27
Ссылочные типы .................................................................................................................................. 27
Значение null ......................................................................................................................................... 28
Расход памяти ....................................................................................................................................... 29
Таксономия стандартных типов ........................................................................................................... 29
VI Îãëàâëåíèå
Числовые типы ............................................................................................................................................... 30
Числовые литералы ............................................................................................................................... 31
Распознавание типов числовых литералов ....................................................................................... 31
Числовые суффиксы ............................................................................................................................ 31
Числовые преобразования .................................................................................................................... 32
Преобразование целого в целое ......................................................................................................... 32
Преобразование числа с плавающей точкой в число с плавающей точкой ................................... 32
Преобразование целого в число с плавающей точкой и обратно .................................................... 33
Десятичные преобразования .............................................................................................................. 33
Арифметические операции ................................................................................................................... 33
Операции инкремента и декремента .................................................................................................... 33
Специальные операции над целыми числами ..................................................................................... 34
Целочисленное деление ...................................................................................................................... 34
Целочисленное переполнение ............................................................................................................ 34
Проверка на переполнение при целочисленных арифметических операциях ............................... 34
Проверка на переполнение выражений с константами .................................................................... 35
Побитовые операции ........................................................................................................................... 35
Восьми- и шестнадцатибитовые целые ............................................................................................... 36
Специальные значения типов float и double ........................................................................................ 36
Типы double и decimal ........................................................................................................................... 37
Ошибки округления вещественных чисел ........................................................................................... 37
Тип bool и булевы операторы ....................................................................................................................... 38
Преобразование типа bool .................................................................................................................... 38
Равенство и операции сравнения ......................................................................................................... 38
Условные операции ............................................................................................................................... 39
Строки и символы .......................................................................................................................................... 40
Преобразование типа char .................................................................................................................... 41
Тип string ................................................................................................................................................ 41
Конкатенация строк ............................................................................................................................ 42
Сравнение строк .................................................................................................................................. 42
Массивы .......................................................................................................................................................... 42
Инициализация элементов по умолчанию ........................................................................................... 43
Типы значений и ссылочные типы .................................................................................................... 43
Многомерные массивы ......................................................................................................................... 44
Прямоугольные массивы .................................................................................................................... 44
Ступенчатые массивы ......................................................................................................................... 44
Упрощенные выражения для инициализации массива ...................................................................... 45
Проверка границ массива ..................................................................................................................... 46
Переменные и параметры .............................................................................................................................. 46
Стек и куча ............................................................................................................................................. 46
Стек ...................................................................................................................................................... 46
Куча ...................................................................................................................................................... 47
Определенное присваивание ................................................................................................................ 48
Значения по умолчанию ........................................................................................................................ 48
Параметры .............................................................................................................................................. 49
Передача аргументов по значению .................................................................................................... 49
Модификатор ref ................................................................................................................................. 50
Модификатор out ................................................................................................................................. 51
Особенности передачи аргументов по ссылке .................................................................................. 52
Модификатор params .......................................................................................................................... 52
Ключевое слово var
: неявная типизация локальных переменных (C# 3.0) ...................................... 53
Выражения и операции .................................................................................................................................. 54
Первичные выражения .......................................................................................................................... 54
Выражения, не имеющие значения ...................................................................................................... 54
Îãëàâëåíèå VII
Выражения присваивания ..................................................................................................................... 54
Приоритет и ассоциативность операций ............................................................................................. 55
Приоритет ............................................................................................................................................ 55
Операции с левой ассоциативностью ................................................................................................ 55
Операции с правой ассоциативностью .............................................................................................. 55
Таблица операций .................................................................................................................................. 56
Операторы ...................................................................................................................................................... 58
Операторы объявления ......................................................................................................................... 58
Локальные переменные....................................................................................................................... 58
Операторы выражений .......................................................................................................................... 59
Операторы выбора ................................................................................................................................. 60
Оператор if ........................................................................................................................................... 60
Конструкция else ................................................................................................................................. 60
Изменение хода выполнения программы с помощью операторных скобок .................................. 60
Оператор switch ................................................................................................................................... 61
Операторы цикла ................................................................................................................................... 63
Циклы while и do-while ....................................................................................................................... 63
Цикл for ................................................................................................................................................ 63
Цикл foreach ........................................................................................................................................ 64
Операторы перехода.............................................................................................................................. 64
Оператор break .................................................................................................................................... 64
Оператор continue................................................................................................................................ 65
Оператор goto ...................................................................................................................................... 65
Оператор return ................................................................................................................................... 66
Оператор throw .................................................................................................................................... 66
Прочие операторы ................................................................................................................................. 66
Пространства имен ......................................................................................................................................... 66
Ключевое слово namespace ................................................................................................................... 67
Полностью квалифицированные имена ............................................................................................... 67
Директива using ..................................................................................................................................... 67
Глобальное пространство имен ............................................................................................................ 68
Правила для пространств имен ............................................................................................................ 68
Область видимости имен .................................................................................................................... 68
Сокрытие имен .................................................................................................................................... 69
Повторяющиеся пространства имен .................................................................................................. 70
Вложенные директивы using .............................................................................................................. 70
Псевдонимы типов и пространств имен .............................................................................................. 71
Дополнительные возможности пространств имен ............................................................................. 71
Внешние пространства имен .............................................................................................................. 71
Квалификаторы псевдонимов для пространств имен ...................................................................... 72
Глава 3. Создание типов в C# ................................................................................................... 75
Классы ............................................................................................................................................................. 75
Поля ........................................................................................................................................................ 75
Модификатор readonly ........................................................................................................................ 76
Инициализация поля ........................................................................................................................... 76
Совместное объявление нескольких полей ....................................................................................... 76
Методы ................................................................................................................................................... 76
Перегрузка методов ............................................................................................................................. 77
Передача параметров по значению и ссылке .................................................................................... 77
Конструкторы экземпляров .................................................................................................................. 77
Перегрузка конструкторов .................................................................................................................. 78
Неявные конструкторы без параметров ............................................................................................ 78
Порядок выполнения конструктора и инициализации полей .......................................................... 78
Закрытые конструкторы ..................................................................................................................... 79
VIII Îãëàâëåíèå
Инициализаторы объектов (C# 3.0) ..................................................................................................... 79
Ссылка this ............................................................................................................................................. 80
Свойства ................................................................................................................................................. 80
Свойства, доступные только для чтения, и вычисляемые свойства ............................................... 81
Автоматические свойства (C# 3.0)..................................................................................................... 82
Обращение к свойству методами get и set ........................................................................................ 82
Реализация свойств в CLR .................................................................................................................. 83
Индексаторы .......................................................................................................................................... 83
Реализация индексатора ..................................................................................................................... 83
Реализация индексатора в CLR .......................................................................................................... 85
Константы .............................................................................................................................................. 85
Статические конструкторы ................................................................................................................... 86
Порядок инициализации статических полей..................................................................................... 87
Недетерминизм статических конструкторов..................................................................................... 87
Статические классы ............................................................................................................................... 87
Финализаторы ........................................................................................................................................ 87
Частичные классы и методы ................................................................................................................. 88
Частичные методы (C# 3.0) ................................................................................................................ 88
Наследование .................................................................................................................................................. 89
Полиморфизм ........................................................................................................................................ 90
Приведение типов .................................................................................................................................. 91
Приведение "вверх"............................................................................................................................. 91
Приведение "вниз" .............................................................................................................................. 91
Операция as ......................................................................................................................................... 92
Операция is .......................................................................................................................................... 92
Виртуальные функции .......................................................................................................................... 92
Абстрактные классы и абстрактные члены ......................................................................................... 93
Сокрытие унаследованных членов ....................................................................................................... 94
Модификаторы new и virtual .............................................................................................................. 94
Запечатывание функций и классов ....................................................................................................... 95
Ключевое слово base ............................................................................................................................. 95
Конструкторы и наследование ............................................................................................................. 96
Неявный вызов конструктора базового класса без параметров ...................................................... 96
Порядок инициализации конструкторов и полей ............................................................................... 97
Перегрузка и разрешение конфликтов................................................................................................. 97
Тип object ........................................................................................................................................................ 98
Упаковка и распаковка .......................................................................................................................... 98
Семантика копирования при упаковке и распаковке ....................................................................... 99
Статическая и динамическая проверка типа ....................................................................................... 99
Метод GetType и операция typeof ....................................................................................................... 100
Метод ToString ..................................................................................................................................... 100
Список членов объекта ....................................................................................................................... 101
Структуры ..................................................................................................................................................... 101
Конструирование структуры .............................................................................................................. 102
Модификаторы доступа ............................................................................................................................... 102
Примеры ............................................................................................................................................... 103
Понижение уровня доступности ........................................................................................................ 103
Ограничения, накладываемые на модификаторы доступа ............................................................... 104
Интерфейсы .................................................................................................................................................. 104
Расширение интерфейса ..................................................................................................................... 105
Явная реализация интерфейса ............................................................................................................ 105
Виртуальная реализация членов интерфейса .................................................................................... 106
Новая реализация интерфейса в подклассе ....................................................................................... 107
Альтернативы реализации интерфейса ........................................................................................... 108
Îãëàâëåíèå IX
Интерфейсы и упаковка ...................................................................................................................... 108
Выбор между классом и интерфейсом............................................................................................... 109
Перечисления ............................................................................................................................................... 110
Преобразования перечислений ........................................................................................................... 110
Перечисление флагов .......................................................................................................................... 111
Операции над перечислениями .......................................................................................................... 112
Безопасность типов ............................................................................................................................. 112
Вложенные типы .......................................................................................................................................... 113
Обобщенные типы ....................................................................................................................................... 114
Объявление обобщенных типов ......................................................................................................... 115
Для чего существуют обобщенные типы .......................................................................................... 116
Обобщенные методы ........................................................................................................................... 117
Объявление обобщенных параметров ............................................................................................... 118
Операция typeof для обобщенных типов ........................................................................................... 118
Значение по умолчанию для обобщенного типа ............................................................................... 119
Ограничения для обобщенных типов ................................................................................................ 119
Обобщенные типы и ковариантность ................................................................................................ 120
Сравнение обобщенных типов и массивов ........................................................................................ 121
Создание подклассов обобщенных классов ...................................................................................... 121
Обобщенные объявления, ссылающиеся на себя.............................................................................. 122
Статические данные ............................................................................................................................ 122
Обобщенные типы C# и шаблоны С++.............................................................................................. 122
Глава 4. Более сложные элементы C# ................................................................................... 125
Делегаты ....................................................................................................................................................... 125
Написание подключаемых методов ................................................................................................... 126
Групповые делегаты ............................................................................................................................ 126
Пример группового делегата ............................................................................................................ 127
Экземплярные методы-цели ............................................................................................................... 128
Обобщенные типы делегатов ............................................................................................................. 128
Делегаты и интерфейсы ...................................................................................................................... 129
Совместимость делегатов ................................................................................................................... 130
Совместимость по типам .................................................................................................................. 130
Совместимость по параметрам ........................................................................................................ 131
Совместимость по типу возвращаемого значения .......................................................................... 131
События ........................................................................................................................................................ 132
Стандартная модель событий ............................................................................................................. 133
Методы обращения к событиям ......................................................................................................... 136
Модификаторы событий ..................................................................................................................... 138
Лямбда-выражения (C# 3.0) ........................................................................................................................ 138
Явное указание типов параметров лямбда-выражения .................................................................... 139
Обобщенные лямбда-выражения и делегаты Func ........................................................................... 140
Внешние переменные .......................................................................................................................... 140
Анонимные методы ...................................................................................................................................... 142
Операторы try и исключения ....................................................................................................................... 142
Конструкция catch ............................................................................................................................... 144
Блок finally ........................................................................................................................................... 146
Оператор using ................................................................................................................................... 146
Возбуждение исключений .................................................................................................................. 147
Повторное возбуждение исключения .............................................................................................. 147
Важнейшие свойства класса System.Exception .................................................................................. 148
Распространенные типы исключений ................................................................................................ 149
Распространенные способы программирования ............................................................................... 149
Применение метода try ..................................................................................................................... 149
Атомарность операций ..................................................................................................................... 150
Альтернативы исключениям ............................................................................................................ 151
X Îãëàâëåíèå
Перечисление и итераторы .......................................................................................................................... 152
Перечисление ....................................................................................................................................... 152
Итераторы ............................................................................................................................................ 153
Семантика итераторов......................................................................................................................... 154
Формирование последовательностей ................................................................................................. 155
Конструирование перечисляемого объекта ....................................................................................... 155
Типы, допускающие значение null.............................................................................................................. 156
Значение null ........................................................................................................................................ 156
Структура Nullable<T> ..................................................................................................................... 157
Явное и неявное преобразование типов, допускающих значение null ......................................... 157
Упаковка и распаковка типов, допускающих значение null .......................................................... 157
Поднятие операций ............................................................................................................................. 158
Операции равенства .......................................................................................................................... 158
Операции отношения ........................................................................................................................ 159
Все остальные операции ................................................................................................................... 159
Смешивание разных типов ............................................................................................................... 159
Тип bool? .............................................................................................................................................. 159
Операция проверки на null ................................................................................................................. 160
Применение типов, допускающих значение null .............................................................................. 160
Альтернативы для типов, допускающих значение null .................................................................... 161
Перегрузка операций ................................................................................................................................... 162
Обзор .................................................................................................................................................... 162
Операторные функции ........................................................................................................................ 162
Перегрузка операций равенства и сравнения .................................................................................... 163
Нестандартные явные и неявные преобразования типов ................................................................. 164
Перегрузка true и false ......................................................................................................................... 165
Методы расширения (C# 3.0) ...................................................................................................................... 166
Цепочки методов расширения ............................................................................................................ 166
Устранение неоднозначности ............................................................................................................. 166
Пространства имен ............................................................................................................................ 166
Методы расширения и методы экземпляров ................................................................................... 167
Разные методы расширения ............................................................................................................. 167
Методы расширения и интерфейсы ................................................................................................... 168
Анонимные типы (C# 3.0) ........................................................................................................................... 169
Атрибуты ...................................................................................................................................................... 169
Классы атрибутов ................................................................................................................................ 170
Именованные и позиционные параметры ......................................................................................... 170
Цели атрибутов .................................................................................................................................... 171
Указание нескольких атрибутов ......................................................................................................... 171
Небезопасный код и указатели .................................................................................................................... 171
Основы работы с указателями ............................................................................................................ 171
Небезопасный код ............................................................................................................................... 172
Оператор fixed ...................................................................................................................................... 172
Операция "указатель на элемент" ....................................................................................................... 173
Массивы ............................................................................................................................................... 173
Ключевое слово stackalloc ................................................................................................................ 173
Буферы фиксированного размера .................................................................................................... 174
Конструкция void* ............................................................................................................................... 174
Указатели на неуправляемый код ...................................................................................................... 175
Препроцессорные директивы ...................................................................................................................... 175
Условные атрибуты ............................................................................................................................. 176
Прагматичный подход к предупреждениям ...................................................................................... 177
XML-документирование .............................................................................................................................. 177
Стандартные XML-теги ...................................................................................................................... 179
Îãëàâëåíèå XI
Теги, определяемые пользователем ................................................................................................... 181
Перекрестные ссылки .......................................................................................................................... 181
Глава 5. Обзор возможностей платформы Framework....................................................... 183
Что нового в .NET Framework 3.5 ............................................................................................................... 184
Среда CLR и "ядро" платформы Framework .............................................................................................. 185
Системные типы .................................................................................................................................. 185
Обработка текста ................................................................................................................................. 186
Коллекции ............................................................................................................................................ 186
Запросы ................................................................................................................................................ 186
XML ...................................................................................................................................................... 186
Потоки и ввод/вывод ........................................................................................................................... 187
Работа в сети ........................................................................................................................................ 187
Сериализация ....................................................................................................................................... 187
Сборки, отражение и атрибуты .......................................................................................................... 188
Безопасность ........................................................................................................................................ 188
Нити выполнения и асинхронные методы ........................................................................................ 188
Домены приложения ........................................................................................................................... 189
Низкоуровневое взаимодействие ....................................................................................................... 189
Диагностика ......................................................................................................................................... 189
Прикладные технологии .............................................................................................................................. 189
Технологии для создания пользовательского интерфейса ............................................................... 189
ASP.NET ............................................................................................................................................. 190
WPF .................................................................................................................................................... 190
Windows Forms .................................................................................................................................. 191
Технологии работы с базами данных ................................................................................................. 192
ADO.NET ........................................................................................................................................... 192
Windows Workflow ............................................................................................................................ 193
COM+ и MSMQ ................................................................................................................................. 193
Технологии построения распределенных систем ............................................................................. 193
WCF .................................................................................................................................................... 193
Удаленное взаимодействие и веб-службы ...................................................................................... 194
CardSpace ........................................................................................................................................... 195
Глава 6. Основы Framework .................................................................................................... 197
Работа со строками и текстом ..................................................................................................................... 197
Тип char ................................................................................................................................................ 197
Строки .................................................................................................................................................. 199
Конструирование строк .................................................................................................................... 199
Пустые строки и строки со значением null ..................................................................................... 199
Обращение к символам в строке ...................................................................................................... 200
Поиск в строке ................................................................................................................................... 200
Манипулирование строками ............................................................................................................. 200
Разбиение и объединение строк ....................................................................................................... 201
Метод String.Format и строки составного формата........................................................................ 202
Сравнение строк .................................................................................................................................. 203
Выяснение порядка и культурные особенности ............................................................................. 203
Сравнение для выяснения равенства ............................................................................................... 204
Сравнение для выяснения порядка .................................................................................................. 205
Класс StringBuilder ............................................................................................................................ 206
Текстовые кодировки и Unicode......................................................................................................... 206
Получение объекта Encoding ............................................................................................................ 208
Кодировка для файлового и потокового ввода/вывода .................................................................. 208
Кодировка для байтовых массивов .................................................................................................. 208
Кодировка UTF-16 и строки ............................................................................................................. 209
XII Îãëàâëåíèå
Дата и время ................................................................................................................................................. 210
Структура TimeSpan ............................................................................................................................ 210
Структуры DateTime и DateTimeOffset .............................................................................................. 211
Выбор между DateTime и DateTimeOffset ....................................................................................... 212
Создание структуры DateTime ......................................................................................................... 213
Создание структуры DateTimeOffset ................................................................................................ 214
Текущие значения структур DateTime и DateTimeOffset ................................................................ 215
Работа с датой и временем ............................................................................................................... 215
Форматирование и разбор даты и времени ..................................................................................... 216
Значение null у DateTime и DateTimeOffset ..................................................................................... 217
Даты и часовые пояса .................................................................................................................................. 218
Часовые пояса и структура DateTime ................................................................................................. 218
Часовые пояса и структура DateTimeOffset ....................................................................................... 218
Классы TimeZone и TimeZoneInfo ....................................................................................................... 219
Класс TimeZone .................................................................................................................................. 219
Класс TimeZoneInfo ........................................................................................................................... 220
Структура DateTime и переход на летнее/зимнее время .................................................................. 223
Форматирование и разбор строк ................................................................................................................. 225
Методы ToString и Parse ..................................................................................................................... 225
Поставщики форматов ........................................................................................................................ 226
Поставщики форматов и класс CultureInfo ..................................................................................... 227
Поставщики NumberFormatInfo и DateTimeFormatInfo ................................................................. 227
Составное форматирование .............................................................................................................. 228
Разбор строк с помощью поставщиков форматов .......................................................................... 228
Интерфейсы IFormatProvider и ICustomFormatter ......................................................................... 229
Стандартные строки формата и флаги разбора ......................................................................................... 230
Строки формата для чисел .................................................................................................................. 231
Флаги NumberStyles ............................................................................................................................. 233
Строки формата для DateTime ............................................................................................................ 234
Разбор строк DateTime и возможные ошибки ................................................................................. 236
Флаги DateTimeStyles .......................................................................................................................... 237
Строки формата для перечисления .................................................................................................... 237
Другие механизмы преобразования ............................................................................................................ 238
Класс Convert ....................................................................................................................................... 238
Округление при преобразовании вещественных чисел в целые ................................................... 238
Системы счисления по основанию 2, 8 и 16 ................................................................................... 239
Динамические преобразования ........................................................................................................ 239
Преобразования base64 ..................................................................................................................... 240
Класс XmlConvert ................................................................................................................................. 240
Преобразователи типов ....................................................................................................................... 240
Класс BitConverter ............................................................................................................................... 241
Работа с числами .......................................................................................................................................... 242
Преобразования ................................................................................................................................... 242
Класс Math ........................................................................................................................................... 242
Класс Random....................................................................................................................................... 243
Перечисления ............................................................................................................................................... 244
Преобразования перечислений ........................................................................................................... 244
Преобразование типа enum в целочисленный тип .......................................................................... 245
Преобразование целочисленного типа в enum ................................................................................ 246
Преобразование строк ....................................................................................................................... 246
Перебор элементов перечисления ...................................................................................................... 246
Как работают перечисления ............................................................................................................... 247
Структура Guid ............................................................................................................................................. 247
Îãëàâëåíèå XIII
Сравнение для выяснения равенства .......................................................................................................... 248
Равенство по значению и ссылочное равенство ............................................................................... 248
Стандартные протоколы равенства .................................................................................................... 249
Операции == и != ............................................................................................................................. 249
Виртуальный метод Object.Equals ................................................................................................... 249
Статический метод object.Equals ..................................................................................................... 250
Статический метод object.ReferenceEquals ..................................................................................... 251
Интерфейс IEquatable<T> ................................................................................................................ 252
Когда Equals не равняется операции == ......................................................................................... 252
Равенство типов, определяемых пользователем ............................................................................... 253
Как переопределить семантику равенства ...................................................................................... 254
Переопределение метода GetHashCode ........................................................................................... 254
Переопределение метода Equals ...................................................................................................... 255
Перегрузка операций == и != .......................................................................................................... 255
Реализация интерфейса IEquatable<T> .......................................................................................... 256
Пример: структура Area .................................................................................................................... 256
Подключаемые интерфейсы сравнения ........................................................................................... 257
Сравнение для выяснения порядка ............................................................................................................. 257
Интерфейсы IComparable ................................................................................................................... 258
Интерфейс IComparable и метод Equals .......................................................................................... 258
Операции < и > ................................................................................................................................... 259
Реализация интерфейсов IComparable ............................................................................................... 260
Вспомогательные классы ............................................................................................................................. 261
Класс Console ....................................................................................................................................... 261
Класс Environment ............................................................................................................................... 262
Класс Process ....................................................................................................................................... 262
Глава 7. Коллекции ................................................................................................................... 265
Перечисление ............................................................................................................................................... 265
Интерфейсы IEnumerable и IEnumerator ........................................................................................... 266
Интерфейсы IEnumerable<T> и IEnumerator<T> ............................................................................ 267
Реализация интерфейсов перечисления ............................................................................................. 268
Интерфейс IDictionaryEnumerator ..................................................................................................... 272
Интерфейсы ICollection и IList .................................................................................................................... 272
Интерфейсы ICollection и ICollection<T> ......................................................................................... 273
Интерфейсы IList и IList<T> .............................................................................................................. 274
Класс Array ................................................................................................................................................... 276
Конструирование массива и индексация его элементов .................................................................. 278
Перебор элементов массива ................................................................................................................ 279
Длина и размерность массива ............................................................................................................. 280
Поиск в массиве ................................................................................................................................... 280
Сортировка массива ............................................................................................................................ 282
Изменение порядка элементов на противоположный ...................................................................... 283
Копирование, преобразование типа и изменение размера массива ................................................ 283
Списки, очереди, стеки и множества .......................................................................................................... 284
Классы List<T> и ArrayList ................................................................................................................ 285
Класс LinkedList<T> ........................................................................................................................... 287
Классы Queue и Queue<T> ................................................................................................................. 289
Классы Stack и Stack<T> .................................................................................................................... 290
Класс BitArray ...................................................................................................................................... 291
Класс HashSet<T> ............................................................................................................................... 292
Словари ......................................................................................................................................................... 294
Интерфейсы IDictionary и IDictionary<TKey,TValue> ..................................................................... 295
Классы Dictionary<TKey,TValue> и Hashtable ................................................................................. 297
XIV Îãëàâëåíèå
Класс OrderedDictionary ..................................................................................................................... 298
Классы ListDictionary и HybridDictionary .......................................................................................... 299
Отсортированные словари .................................................................................................................. 299
Коллекции, настраиваемые пользователем, и прокси-классы .................................................................. 301
Классы Collection<T> и CollectionBase ............................................................................................. 301
Классы KeyedCollection<TKey,TItem> и DictionaryBase .................................................................. 304
Класс ReadOnlyCollection<T> ............................................................................................................ 306
Подключение протоколов выяснения равенства и порядка ..................................................................... 307
Интерфейсы IEqualityComparer и класс EqualityComparer ............................................................. 308
Интерфейсы IComparer и класс Comparer ........................................................................................ 310
Класс StringComparer .......................................................................................................................... 312
Глава 8. Запросы LINQ............................................................................................................. 315
Основы .......................................................................................................................................................... 315
Лямбда-запросы ........................................................................................................................................... 317
Цепочки операторов запросов ............................................................................................................ 317
Почему важны методы расширения ................................................................................................ 320
Составление лямбда-выражений ........................................................................................................ 320
Лямбда-выражения и сигнатуры делегатов Func ........................................................................... 321
Лямбда-выражения и типы элементов............................................................................................. 321
Естественный порядок элементов ...................................................................................................... 323
Прочие операторы ............................................................................................................................... 323
Синтаксис, облегчающий восприятие запроса .......................................................................................... 324
Переменные итерации ......................................................................................................................... 326
Синтаксис, облегчающий восприятие запроса, и SQL-синтаксис ................................................... 326
Синтаксис, облегчающий восприятие запроса, и лямбда-синтаксис .............................................. 327
Запросы со смешанным синтаксисом ................................................................................................ 327
Отложенное выполнение ............................................................................................................................. 328
Повторное выполнение ....................................................................................................................... 329
Внешние переменные .......................................................................................................................... 330
Механика отложенного выполнения ................................................................................................. 331
Цепочки декораторов .......................................................................................................................... 332
Как выполняются запросы .................................................................................................................. 333
Подзапросы ................................................................................................................................................... 334
Подзапросы и отложенное выполнение ............................................................................................ 337
Стратегии построения сложных запросов ................................................................................................. 338
Последовательное построение запросов ........................................................................................... 338
Ключевое слово into ............................................................................................................................ 339
Правила определения областей видимости ..................................................................................... 340
Создание оболочек для запросов ....................................................................................................... 340
Стратегии проецирования ........................................................................................................................... 342
Инициализаторы объектов .................................................................................................................. 342
Анонимные типы ................................................................................................................................. 342
Ключевое слово let .............................................................................................................................. 343
Интерпретируемые запросы ........................................................................................................................ 344
Как работают интерпретируемые запросы ........................................................................................ 346
Выполнение ....................................................................................................................................... 347
Комбинирование интерпретируемых и локальных запросов .......................................................... 349
Оператор AsEnumerable ...................................................................................................................... 350
Запросы LINQ to SQL .................................................................................................................................. 352
Классы сущностей в технологии LINQ to SQL ................................................................................. 352
Объект DataContext ............................................................................................................................. 353
Автоматическое генерирование сущностей ...................................................................................... 355
Ассоциирование .................................................................................................................................. 355
Îãëàâëåíèå XV
Отложенное выполнение запросов LINQ to SQL ............................................................................. 356
Класс DataLoadOptions ....................................................................................................................... 358
Предварительное указание фильтра ................................................................................................ 358
"Нетерпеливая" загрузка ................................................................................................................... 359
Обновления .......................................................................................................................................... 359
Построение выражений для запросов ........................................................................................................ 361
Делегаты и деревья выражений .......................................................................................................... 361
Компиляция деревьев выражений ................................................................................................... 362
Оператор AsQueryable....................................................................................................................... 363
Деревья выражений ............................................................................................................................. 363
Объектная модель документов для выражений .............................................................................. 363
Глава 9. Операторы LINQ ....................................................................................................... 367
Обзор операторов ......................................................................................................................................... 368
Коллекция → коллекция ..................................................................................................................... 368
Фильтрация ........................................................................................................................................ 369
Проецирование .................................................................................................................................. 369
Объединение ...................................................................................................................................... 369
Упорядочивание ................................................................................................................................ 369
Группирование .................................................................................................................................. 369
Операции над множествами ............................................................................................................. 370
Методы преобразования: импорт ..................................................................................................... 370
Методы преобразования: экспорт .................................................................................................... 370
Коллекция → не коллекция ................................................................................................................ 370
Поэлементные операции ................................................................................................................... 370
Методы агрегирования ..................................................................................................................... 370
Квантификаторы................................................................................................................................ 370
Не коллекция → коллекция ................................................................................................................ 371
Методы генерирования коллекций .................................................................................................. 371
Фильтрация ................................................................................................................................................... 371
Оператор Where ................................................................................................................................... 372
Синтаксис, облегчающий восприятие запроса ............................................................................... 372
Реализация метода Enumerable.Where ............................................................................................. 372
Описание ............................................................................................................................................ 372
Индексированная фильтрация .......................................................................................................... 373
Оператор Where в запросе LINQ to SQL ......................................................................................... 373
Операторы Take и Skip ........................................................................................................................ 373
Операторы TakeWhile и SkipWhile ...................................................................................................... 374
Оператор Distinct ................................................................................................................................. 375
Проецирование ............................................................................................................................................. 375
Оператор Select .................................................................................................................................... 375
Синтаксис, облегчающий восприятие запроса ............................................................................... 375
Реализация в классе Enumerable ...................................................................................................... 375
Описание .............................................................................................................................................. 376
Индексированная проекция .............................................................................................................. 376
Подзапросы Select и иерархия объектов ......................................................................................... 377
Подзапросы и объединения в запросах LINQ to SQL .................................................................... 377
Проецирование в конкретные типы ................................................................................................. 379
Оператор SelectMany ........................................................................................................................... 380
Синтаксис, облегчающий восприятие запроса ............................................................................... 380
Реализация в классе Enumerable ...................................................................................................... 380
Описание ............................................................................................................................................ 381
Внешние переменные итерации ....................................................................................................... 382
Мышление в соответствии с синтаксисом, облегчающим восприятие запроса .......................... 383
XVI Îãëàâëåíèå
Объединение с помощью оператора SelectMany ............................................................................ 384
Оператор SelectMany в запросах LINQ to SQL ............................................................................... 385
Внешние объединения с помощью оператора SelectMany............................................................. 386
Объединение ................................................................................................................................................. 388
Операторы Join и GroupJoin ............................................................................................................... 388
Аргументы оператора Join ............................................................................................................... 388
Аргументы оператора GroupJoin ..................................................................................................... 389
Синтаксис, облегчающий восприятие запроса ............................................................................... 389
Описание ............................................................................................................................................ 389
Оператор Join .................................................................................................................................... 390
Объединение по нескольким ключам .............................................................................................. 392
Объединение в лямбда-синтаксисе .................................................................................................. 392
Оператор GroupJoin .......................................................................................................................... 393
Плоские внешние объединения ........................................................................................................ 394
Объединение и таблицы просмотра ................................................................................................. 394
Реализации в классе Enumerable ...................................................................................................... 396
Упорядочивание ........................................................................................................................................... 397
Операторы OrderBy, OrderByDescending, ThenBy и ThenByDescending.......................................... 397
Аргументы операторов OrderBy и OrderByDescending .................................................................. 397
Аргументы операторов ThenBy и ThenByDescending ..................................................................... 397
Синтаксис, облегчающий восприятие запроса ............................................................................... 398
Описание ............................................................................................................................................ 398
Классы, выполняющие сравнение, и сортировка ........................................................................... 398
Интерфейсы IOrderedEnumerable и IOrderedQueryable ................................................................ 399
Группирование ............................................................................................................................................. 400
Оператор GroupBy ............................................................................................................................... 400
Синтаксис, облегчающий восприятие запроса ............................................................................... 400
Описание ............................................................................................................................................ 400
Оператор GroupBy в запросах LINQ to SQL ................................................................................... 402
Группирование по нескольким ключам ........................................................................................... 403
Пользовательские классы для выяснения равенства ...................................................................... 403
Операции над множествами ........................................................................................................................ 403
Операторы Concat и Union ................................................................................................................. 403
Операторы Intersect и Except .............................................................................................................. 404
Методы преобразования .............................................................................................................................. 404
Операторы OfType и Cast .................................................................................................................... 405
Операторы ToArray, ToList, ToDictionary и ToLookup ...................................................................... 406
Операторы AsEnumerable и AsQueryable ........................................................................................... 407
Поэлементные операции .............................................................................................................................. 407
Операторы First, Last и Single ............................................................................................................ 408
Оператор ElementAt ............................................................................................................................. 408
Оператор DefaultIfEmpty ..................................................................................................................... 409
Методы агрегирования ................................................................................................................................ 409
Операторы Count и LongCount ........................................................................................................... 409
Операторы Min и Max ......................................................................................................................... 410
Операторы Sum и Average ................................................................................................................... 411
Оператор Aggregate ............................................................................................................................. 412
Квантификаторы .......................................................................................................................................... 412
Операторы Contains и Any .................................................................................................................. 412
Операторы All и SequenceEqual .......................................................................................................... 413
Методы генерирования коллекций ............................................................................................................. 413
Метод Empty ........................................................................................................................................ 413
Методы Range и Repeat ....................................................................................................................... 414
Îãëàâëåíèå XVII
Глава 10. Запросы LINQ to XML ............................................................................................ 415
Обзор архитектуры ...................................................................................................................................... 415
Что такое DOM? .................................................................................................................................. 415
DOM в технологии запросов LINQ to XML ...................................................................................... 416
Обзор модели X-DOM ................................................................................................................................. 416
Загрузка и синтаксический анализ ..................................................................................................... 418
Сохранение и сериализация ................................................................................................................ 419
Создание экземпляра дерева X-DOM ......................................................................................................... 420
Функциональное конструирование .................................................................................................... 420
Указание содержимого ....................................................................................................................... 421
Автоматическое глубокое клонирование .......................................................................................... 422
Навигация и отправка запросов .................................................................................................................. 423
Навигация по узлам-потомкам ........................................................................................................... 423
Методы FirstNode, LastNode и Nodes .............................................................................................. 424
Чтение элементов .............................................................................................................................. 424
Чтение одного элемента .................................................................................................................... 425
Рекурсивные функции ....................................................................................................................... 426
Навигация по родительским элементам ............................................................................................ 426
Навигация по элементам одного уровня ........................................................................................... 427
Навигация по атрибутам ..................................................................................................................... 428
Редактирование дерева X-DOM .................................................................................................................. 428
Обновление простых значений........................................................................................................... 428
Редактирование узлов-потомков и атрибутов ................................................................................... 429
Обновление узла через его родителя ................................................................................................. 430
Удаление последовательности узлов и атрибутов .......................................................................... 430
Работа со значениями .................................................................................................................................. 431
Установка значений............................................................................................................................. 432
Чтение значений .................................................................................................................................. 432
Значения и узлы со смешанным содержимым .................................................................................. 433
Автоматическая конкатенация элементов XText ............................................................................... 434
Документы и объявления............................................................................................................................. 434
Класс XDocument ................................................................................................................................. 434
XML-объявления ................................................................................................................................. 436
Запись объявления в строку ............................................................................................................. 437
Имена и пространства имен ........................................................................................................................ 438
Пространства имен в XML ................................................................................................................. 438
Префиксы ........................................................................................................................................... 439
Атрибуты ........................................................................................................................................... 440
Указание пространства имен в модели X-DOM ............................................................................... 440
X-DOM и пространства имен по умолчанию .................................................................................... 441
Префиксы ........................................................................................................................................... 443
Аннотации .................................................................................................................................................... 444
Проецирование в модель X-DOM ............................................................................................................... 445
Исключение пустых элементов .......................................................................................................... 447
Проецирование в поток ....................................................................................................................... 448
Преобразование дерева X-DOM ......................................................................................................... 449
Более сложные преобразования ....................................................................................................... 450
Глава 11. Другие XML-технологии ........................................................................................ 453
Класс XmlReader ........................................................................................................................................... 453
Чтение узлов ........................................................................................................................................ 455
Чтение элементов ................................................................................................................................ 457
Необязательные элементы ................................................................................................................ 458
Произвольный порядок элементов ................................................................................................... 458
Пустые элементы ............................................................................................................................... 459
Другие методы семейства ReadXXX................................................................................................. 459
XVIII Îãëàâëåíèå
Чтение атрибутов................................................................................................................................. 461
Узлы-атрибуты .................................................................................................................................. 461
Пространства имен и префиксы ......................................................................................................... 462
Класс XmlWriter ................................................................................................................................... 463
Запись атрибутов ................................................................................................................................. 464
Запись узлов других типов ................................................................................................................. 464
Пространства имен и префиксы ......................................................................................................... 465
Примеры использования классов XmlReader и XmlWriter ........................................................................ 465
Работа с иерархическими структурами ............................................................................................. 465
Комбинирование класса XmlReader или XmlWriter с моделью X-DOM ......................................... 468
Использование XmlReader с типом XElement.................................................................................. 468
Использование XmlWriter с типом XElement ................................................................................... 469
Класс XmlDocument ...................................................................................................................................... 470
Загрузка и сохранение объекта XmlDocument ................................................................................... 471
Обход дерева XmlDocument ................................................................................................................ 471
Свойства InnerText и InnerXml............................................................................................................ 472
Создание узлов и манипуляции с ними ............................................................................................. 472
Пространства имен .............................................................................................................................. 473
Язык XPath.................................................................................................................................................... 474
Самые распространенные операторы XPath ..................................................................................... 475
Класс XPathNavigator .......................................................................................................................... 476
Выдача запросов с учетом пространств имен ................................................................................... 477
Класс XPathDocument .......................................................................................................................... 478
XSD и проверка корректности документа ................................................................................................. 478
Проверка соответствия схеме ............................................................................................................. 479
Проверка с помощью класса XmlReader.......................................................................................... 479
Проверка дерева X-DOM или объекта XmlDocument ..................................................................... 481
XSLT ............................................................................................................................................................. 481
Глава 12. Удаление объектов и сборка мусора .................................................................... 483
Интерфейс IDisposable и методы Dispose и Close ..................................................................................... 483
Стандартная семантика удаления объектов ...................................................................................... 484
Методы Close и Stop .......................................................................................................................... 485
Когда следует удалять объекты .......................................................................................................... 485
Условное удаление .............................................................................................................................. 486
Сборка мусора и финализаторы .................................................................................................................. 488
Вызов метода Dispose из финализатора ..................................................................................................... 490
Как работает сборщик мусора ..................................................................................................................... 491
Приемы оптимизации .......................................................................................................................... 492
Принудительная сборка мусора ......................................................................................................... 492
Альтернативы сборке мусора ...................................................................................................................... 493
Глава 13. Потоки и ввод/вывод .............................................................................................. 495
Архитектура потоков ................................................................................................................................... 495
Работа с потоками ........................................................................................................................................ 497
Чтение и запись ................................................................................................................................... 498
Перемещение внутри потока .............................................................................................................. 499
Закрытие и очистка буфера ................................................................................................................ 500
Тайм-ауты ............................................................................................................................................. 500
Безопасность работы нитей с потоками ............................................................................................ 500
Поток с резервным хранилищем ........................................................................................................ 501
Класс FileStream .................................................................................................................................. 501
Конструирование объекта FileStream .............................................................................................. 501
Указание имени файла ...................................................................................................................... 502
Îãëàâëåíèå XIX
Указание режима FileMode .............................................................................................................. 502
Дополнительные характеристики класса FileStream ...................................................................... 504
Класс MemoryStream ........................................................................................................................... 504
Класс PipeStream ................................................................................................................................. 505
Именованные каналы ........................................................................................................................ 506
Анонимные каналы ........................................................................................................................... 507
Класс BufferedStream ........................................................................................................................... 509
Потоковые адаптеры .................................................................................................................................... 510
Текстовые адаптеры ............................................................................................................................ 510
Классы StreamReader и StreamWriter .............................................................................................. 512
Кодировки символов ......................................................................................................................... 513
Классы StringReader и StringWriter ................................................................................................. 515
Двоичные адаптеры ............................................................................................................................. 515
Закрытие и удаление адаптеров потоков ........................................................................................... 516
Операции с файлами и каталогами ............................................................................................................. 517
Класс File ............................................................................................................................................. 518
Атрибуты архивирования и шифрования ....................................................................................... 519
Безопасность файла ........................................................................................................................... 520
Класс Directory .................................................................................................................................... 521
Классы FileInfo и DirectoryInfo........................................................................................................... 522
Класс Path ............................................................................................................................................ 523
Специальные папки ............................................................................................................................. 524
Получение информации о томе .......................................................................................................... 525
Слежение за событиями файловой системы ..................................................................................... 525
Сжатие файлов ............................................................................................................................................. 526
Сжатие данных в памяти..................................................................................................................... 528
Изолированная память ................................................................................................................................. 528
Виды изоляции .................................................................................................................................... 529
Чтение и запись в изолированную память......................................................................................... 531
Местоположение изолированной памяти .......................................................................................... 532
Перебор элементов изолированной памяти ...................................................................................... 533
Глава 14. Работа в сети............................................................................................................. 535
Архитектура сети ......................................................................................................................................... 535
Адреса и порты ............................................................................................................................................. 537
URI ................................................................................................................................................................ 538
Архитектура "запрос/ответ" ........................................................................................................................ 540
Класс WebClient ................................................................................................................................... 541
Классы WebRequest и WebResponse .................................................................................................... 542
Прокси-серверы ................................................................................................................................... 543
Аутентификация .................................................................................................................................. 544
Класс CredentialCache ...................................................................................................................... 546
Параллелизм......................................................................................................................................... 546
Обработка исключений ....................................................................................................................... 548
Поддержка протокола HTTP ....................................................................................................................... 549
Заголовки ............................................................................................................................................. 549
Строки запросов .................................................................................................................................. 550
Выгрузка данных формы .................................................................................................................... 550
Cookie ................................................................................................................................................... 551
Аутентификация с помощью форм .................................................................................................... 553
SSL ........................................................................................................................................................ 554
Создание HTTP-сервера .............................................................................................................................. 554
Работа с протоколом FTP ............................................................................................................................ 558
Работа с DNS ................................................................................................................................................ 560
XX Îãëàâëåíèå
Отправка почты с помощью класса SmtpClient ......................................................................................... 560
Работа с протоколом ТСР ............................................................................................................................ 561
Параллелизм и TCP ............................................................................................................................. 564
Прием POP3-почты с помощью протокола ТСР ....................................................................................... 565
Глава 15. Сериализация ........................................................................................................... 567
Концепции сериализации ............................................................................................................................ 567
Механизмы сериализации ................................................................................................................... 567
Зачем нужны три механизма? .......................................................................................................... 568
Сериализатор с контрактом данных ................................................................................................ 569
Двоичный сериализатор ................................................................................................................... 569
Класс XmlSerializer ............................................................................................................................ 570
Интерфейс IXmlSerializable .............................................................................................................. 570
Форматеры ........................................................................................................................................... 570
Явная и неявная сериализация ........................................................................................................... 571
Сериализатор с контрактом данных ........................................................................................................... 571
Классы DataContractSerializer и NetDataContractSerializer ............................................................. 572
Применение сериализаторов .............................................................................................................. 573
Использование двоичного форматера ............................................................................................. 575
Сериализация подклассов ................................................................................................................... 575
Ссылки на объекты .............................................................................................................................. 577
Сохранение ссылок на объекты ....................................................................................................... 578
Устойчивость к изменению версии .................................................................................................... 579
Необходимые члены типа ................................................................................................................. 580
Порядок следования членов ........................................................................................................................ 580
Пустое значение и значение null ........................................................................................................ 581
Контракты данных и коллекции ................................................................................................................. 582
Элементы коллекции с подклассами .................................................................................................. 583
Изменение имен коллекций и элементов ........................................................................................... 583
Расширение контрактов данных ................................................................................................................. 585
Инструменты сериализации и десериализации ................................................................................. 585
Взаимодействие с типом, помеченным как [Serializable] ................................................................ 586
Взаимодействие с типом, реализующим интерфейс IXmlSerializable ............................................. 588
Двоичный сериализатор .............................................................................................................................. 588
С чего начать ....................................................................................................................................... 589
Атрибуты двоичной сериализации ............................................................................................................. 590
Атрибут [NonSerialized] ...................................................................................................................... 590
Атрибуты [OnDeserializing] и [OnDeserialized] ............................................................................... 591
Атрибуты [OnSerializing] и [OnSerialized]........................................................................................ 592
Атрибут [OptionalField] и сопровождение версий ........................................................................... 593
Двоичная сериализация и интерфейс ISerializable .................................................................................... 594
Создание подклассов сериализуемых классов .................................................................................. 596
XML-сериализация ...................................................................................................................................... 597
Сериализация на основе атрибутов .................................................................................................... 598
Атрибуты, имена и пространства имен ........................................................................................... 599
Порядок следования XML-элементов .............................................................................................. 600
Подклассы и объекты-потомки .......................................................................................................... 600
Образование подкласса от корневого типа ..................................................................................... 600
Сериализация объектов-потомков ................................................................................................... 601
Подклассы объектов-потомков ........................................................................................................ 602
Сериализация коллекций .................................................................................................................... 603
Работа с элементами коллекций, имеющими подклассы ............................................................... 605
Интерфейс IXmlSerializable ................................................................................................................ 605
Îãëàâëåíèå XXI
Глава 16. Сборки ....................................................................................................................... 609
Что такое сборка .......................................................................................................................................... 609
Манифест сборки ................................................................................................................................. 610
Указание атрибутов сборки .............................................................................................................. 611
Манифест приложения ........................................................................................................................ 611
Развертывание манифеста приложения ........................................................................................... 611
Модули ................................................................................................................................................. 612
Класс Assembly ..................................................................................................................................... 613
Подписание сборки ...................................................................................................................................... 614
Как подписать сборку ......................................................................................................................... 615
Отсроченное подписание .................................................................................................................... 616
Имена сборок ................................................................................................................................................ 617
Полностью квалифицированные имена ............................................................................................. 618
Класс AssemblyName ............................................................................................................................ 618
Глобальный кэш сборок .............................................................................................................................. 619
Как устанавливать сборки в глобальном кэше сборок ..................................................................... 620
Глобальный кэш сборок и отслеживание версий .............................................................................. 621
Ресурсы и вспомогательные сборки ........................................................................................................... 622
Непосредственное встраивание ресурсов .......................................................................................... 623
Файлы .resources .................................................................................................................................. 624
Файлы .resx........................................................................................................................................... 625
Создание .resx-файла из командной строки .................................................................................... 625
Чтение файлов .resources .................................................................................................................. 626
Создание URI типа "pack" в Visual Studio ....................................................................................... 627
Вспомогательные сборки .................................................................................................................... 627
Построение вспомогательных сборок.............................................................................................. 628
Тестирование вспомогательных сборок .......................................................................................... 629
Поддержка Visual Studio ................................................................................................................... 629
Культуры и субкультуры..................................................................................................................... 630
Поиск и загрузка сборок .............................................................................................................................. 631
Правила поиска сборок и типов ......................................................................................................... 631
Событие AssemblyResolve .................................................................................................................... 632
Загрузка сборок ................................................................................................................................... 632
Загрузка из файла .............................................................................................................................. 633
Развертывание сборок за пределами базового каталога ........................................................................... 634
Упаковка однофайлового приложения ....................................................................................................... 636
Избирательное наложение "заплат" ................................................................................................... 637
Работа со сборками, на которые нет ссылок .............................................................................................. 637
Глава 17. Отражение и метаданные....................................................................................... 641
Отражение и активизация типов ................................................................................................................. 641
Получение экземпляра класса Type .................................................................................................... 641
Получение типов массивов ............................................................................................................... 642
Получение вложенных типов ........................................................................................................... 643
Имена типов ......................................................................................................................................... 643
Имена вложенных типов ................................................................................................................... 644
Имена обобщенных типов ................................................................................................................ 644
Имена массивов и типов указателей ................................................................................................ 644
Имена типов параметров с модификаторами ref и out ................................................................... 644
Базовые типы и интерфейсы ............................................................................................................... 645
Создание экземпляров типов .............................................................................................................. 645
Обобщенные типы ............................................................................................................................... 647
Отражение и вызов членов .......................................................................................................................... 647
Типы-члены .......................................................................................................................................... 649
Члены C# и члены CLR ....................................................................................................................... 651
XXII Îãëàâëåíèå
Члены обобщенных типов .................................................................................................................. 652
Динамический вызов члена ................................................................................................................ 653
Параметры методов ............................................................................................................................. 653
Повышение производительности с помощью делегатов ................................................................. 654
Обращение к закрытым членам .......................................................................................................... 654
Перечисление BindingFlags .............................................................................................................. 655
Обобщенные методы ........................................................................................................................... 656
Анонимный вызов членов обобщенного типа .................................................................................. 656
Отражение сборок ........................................................................................................................................ 658
Загрузка сборки в контекст, допускающий только отражение ........................................................ 659
Модули ................................................................................................................................................. 659
Работа с атрибутами..................................................................................................................................... 660
Основы работы с атрибутами ............................................................................................................. 660
Атрибут AttributeUsage ....................................................................................................................... 661
Определение собственного атрибута ................................................................................................. 662
Чтение атрибутов на этапе выполнения ............................................................................................ 663
Получение атрибутов в контексте отражения ................................................................................... 665
Динамическое генерирование кода ............................................................................................................ 665
Генерирование IL-кода с помощью класса DynamicMethod ............................................................ 665
Стек вычислений ................................................................................................................................. 667
Передача параметров классу DynamicMethod ................................................................................... 668
Генерирование локальных переменных............................................................................................. 669
Ветвление ............................................................................................................................................. 670
Создание объектов и вызов экземплярных методов ......................................................................... 670
Обработка исключений ....................................................................................................................... 672
Генерирование сборок и типов ................................................................................................................... 673
Сохранение порожденных сборок ..................................................................................................... 674
Объектная модель Reflection.Emit ...................................................................................................... 675
Генерирование членов типа ........................................................................................................................ 676
Генерирование методов ...................................................................................................................... 677
Генерирование методов экземпляров .............................................................................................. 678
Атрибут HideBySig ............................................................................................................................ 678
Генерирование полей и свойств ......................................................................................................... 679
Генерирование конструкторов ........................................................................................................... 680
Вызов конструкторов базовых классов ........................................................................................... 681
Добавление атрибутов ......................................................................................................................... 682
Генерирование обобщенных методов и типов........................................................................................... 682
Определение обобщенных методов ................................................................................................... 682
Определение обобщенных типов ....................................................................................................... 684
Неудобные цели генерирования ................................................................................................................. 684
Несозданные замкнутые обобщенные типы ...................................................................................... 684
Циклические зависимости .................................................................................................................. 685
Анализ IL-кода ............................................................................................................................................. 688
Написание дизассемблера ................................................................................................................... 688
Глава 18. Безопасность ............................................................................................................. 695
Разрешения ................................................................................................................................................... 695
Классы CodeAccessPermission и PrincipalPermission ....................................................................... 696
Интерфейс IPermission ...................................................................................................................... 697
Класс PermissionSet ............................................................................................................................. 698
Декларативная и принудительная безопасность ............................................................................... 699
Безопасность обращения к коду ................................................................................................................. 699
Как CLR выделяет разрешения .......................................................................................................... 701
Îãëàâëåíèå XXIII
Работа в изоляции ........................................................................................................................................ 703
Необязательные разрешения .............................................................................................................. 704
Флаг SecurityAction.RequestOptional ................................................................................................ 704
Изоляция другой сборки .............................................................................................................................. 705
Требования связывания и частичное доверие к вызывающему коду .............................................. 706
Как утверждать права .......................................................................................................................... 707
Безопасность в операционной системе....................................................................................................... 708
Работа под стандартной пользовательской учетной записью ......................................................... 709
Повышение прав и виртуализация ..................................................................................................... 710
Безопасность, основанная на именах и ролях ............................................................................................ 711
Указание пользователей и ролей ........................................................................................................ 712
Обзор криптографических возможностей ................................................................................................. 713
Защита данных Windows ............................................................................................................................. 713
Хеширование ................................................................................................................................................ 714
Симметричное шифрование ........................................................................................................................ 716
Шифрование в памяти......................................................................................................................... 717
Образование цепочек из потоков шифрования ................................................................................. 719
Уничтожение шифрующих объектов ................................................................................................ 720
Управление ключами .......................................................................................................................... 721
Шифрование с открытым ключом и постановка цифровой подписи ...................................................... 721
Класс RSA ............................................................................................................................................. 722
Цифровая подпись ............................................................................................................................... 723
Глава 19. Нити выполнения .................................................................................................... 725
Правильное использование нитей ............................................................................................................... 725
Основы .......................................................................................................................................................... 726
Передача данных ................................................................................................................................. 729
Совместное обращение к данным ...................................................................................................... 730
Пулы нитей .......................................................................................................................................... 731
Оптимизация пула ............................................................................................................................. 733
Приоритетные и фоновые нити .......................................................................................................... 734
Приоритет нити ................................................................................................................................... 735
Обработка исключений ....................................................................................................................... 736
Асинхронные делегаты ................................................................................................................................ 737
Синхронизация ............................................................................................................................................. 739
Приостановка выполнения ................................................................................................................. 740
Приостановка и работа вхолостую .................................................................................................... 741
Метод SpinWait .................................................................................................................................. 741
Блокировка .................................................................................................................................................... 741
Выбор синхронизирующего объекта ................................................................................................. 743
Вложенные блокировки ...................................................................................................................... 744
Когда ставить блокировку .................................................................................................................. 744
Блокировка и атомарность .................................................................................................................. 745
Производительность кода, соперничество блокировок и взаимные блокировки .......................... 745
Класс Mutex .......................................................................................................................................... 746
Класс Semaphore .................................................................................................................................. 747
Безопасность нитей ...................................................................................................................................... 748
Безопасность нитей и типы .NET Framework .................................................................................... 750
Блокирование безопасных объектов ................................................................................................ 751
Статические методы .......................................................................................................................... 751
Безопасность нитей в серверах приложений ..................................................................................... 752
Безопасность нитей в многофункциональных клиентских приложениях ...................................... 753
Незадерживающая синхронизация ............................................................................................................. 754
Атомарность и класс Interlocked ........................................................................................................ 754
Барьеры памяти и некэшируемость ................................................................................................... 756
XXIV Îãëàâëåíèå
Сигнализация с помощью дескрипторов ожидания событий .................................................................. 757
Создание и уничтожение дескрипторов ожидания........................................................................... 759
Двухсторонняя сигнализация ............................................................................................................. 760
Создание объекта EventWaitHandle для нескольких процессов ...................................................... 761
Пул дескрипторов ожидания .............................................................................................................. 761
Методы WaitAny, WaitAll и SignalAndWait ........................................................................................ 763
Сигнализация с помощью методов Wait и Pulse ....................................................................................... 763
Как пользоваться методами Wait и Pulse ........................................................................................... 764
Очередь "производитель/потребитель" ............................................................................................. 767
Тайм-ауты метода Wait ....................................................................................................................... 770
Двухсторонняя сигнализация ............................................................................................................. 771
Имитация дескрипторов ожидания .................................................................................................... 773
Методы Interrupt и Abort ............................................................................................................................. 774
Метод Interrupt .................................................................................................................................... 774
Метод Abort.......................................................................................................................................... 776
Безопасное завершение ....................................................................................................................... 776
Локальное хранение данных ....................................................................................................................... 777
Класс BackgroundWorker ............................................................................................................................. 778
Создание подкласса для BackgroundWorker ...................................................................................... 782
Класс ReaderWriterLockSlim ........................................................................................................................ 783
Обновляемые блокировки и рекурсия ............................................................................................... 785
Рекурсия блокировок ........................................................................................................................ 787
Таймеры ........................................................................................................................................................ 788
Многонитевые таймеры ...................................................................................................................... 788
Однонитевые таймеры ........................................................................................................................ 790
Глава 20. Асинхронные методы .............................................................................................. 793
Для чего существуют асинхронные методы .............................................................................................. 793
Сигнатуры асинхронных методов ............................................................................................................... 794
Асинхронные методы и асинхронные делегаты ........................................................................................ 795
Применение асинхронных методов ............................................................................................................ 796
Написание асинхронных методов ............................................................................................................... 799
Поддельные асинхронные методы .............................................................................................................. 802
Альтернативы асинхронным методам ........................................................................................................ 803
Асинхронные события ................................................................................................................................. 804
Глава 21. Домены приложений ............................................................................................... 805
Архитектура доменов приложений ............................................................................................................. 805
Создание и уничтожение доменов приложений ........................................................................................ 805
Работа с несколькими доменами приложения ........................................................................................... 808
Метод DoCallBack ........................................................................................................................................ 810
Домены и нити ............................................................................................................................................. 811
Совместное обращение к данным из разных доменов .............................................................................. 812
Применение слотов ............................................................................................................................. 812
Удаленное взаимодействие внутри процесса .................................................................................... 813
Изолирование типов и сборок ............................................................................................................ 815
Раскрытие типа .................................................................................................................................. 817
Глава 22. Интеграция с DLL ................................................................................................... 819
Вызов кода из DLL ....................................................................................................................................... 819
Маршалинг обычных типов ........................................................................................................................ 820
Маршалинг классов и структур................................................................................................................... 821
Входной и выходной маршалинг ................................................................................................................ 822
Обратные вызовы из неуправляемого кода ................................................................................................ 823
Îãëàâëåíèå XXV
Имитация объединения из языка С............................................................................................................. 824
Совместно используемая память ................................................................................................................ 825
Отображение структуры в неуправляемую память ................................................................................... 827
Ключевое слово fixed........................................................................................................................... 830
Справочник по атрибутам ........................................................................................................................... 831
Атрибут DllImport ............................................................................................................................... 831
Атрибут StructLayout ........................................................................................................................... 832
Атрибут FieldOffset.............................................................................................................................. 833
Атрибут MarshalAs .............................................................................................................................. 833
Элементы перечисления UnmanagedType ....................................................................................... 834
Глава 23. Диагностика.............................................................................................................. 837
Условная компиляция .................................................................................................................................. 837
Условная компиляция как альтернатива статическим переменным-флагам .................................. 838
Атрибут Conditional ............................................................................................................................ 839
Альтернативы атрибуту Conditional ................................................................................................ 840
Классы Debug и Trace .................................................................................................................................. 840
Класс TraceListener .............................................................................................................................. 841
Принудительная запись на диск и закрытие слушателей ................................................................. 843
Интеграция с отладчиком ............................................................................................................................ 843
Присоединение отладчика и прерывание выполнения ..................................................................... 844
Атрибуты отладчика............................................................................................................................ 844
Процессы и нити .......................................................................................................................................... 845
Анализ работающего процесса ........................................................................................................... 845
Анализ нитей в процессе..................................................................................................................... 845
Классы StackTrace и StackFrame ................................................................................................................. 846
Журнал событий Windows ........................................................................................................................... 848
Запись в журнал событий.................................................................................................................... 848
Чтение журнала событий .................................................................................................................... 849
Мониторинг журнала событий ........................................................................................................... 849
Счетчики производительности ................................................................................................................... 850
Просмотр доступных счетчиков ......................................................................................................... 851
Чтение данных из счетчиков производительности ........................................................................... 852
Создание счетчиков и запись данных о производительности ......................................................... 853
Класс Stopwatch ............................................................................................................................................ 855
Глава 24. Регулярные выражения .......................................................................................... 857
Основы регулярных выражений ................................................................................................................. 857
Откомпилированные регулярные выражения ................................................................................... 858
Перечисление RegexOptions ................................................................................................................ 859
Экранирование символов .................................................................................................................... 860
Множества символов .......................................................................................................................... 861
Квантификаторы .......................................................................................................................................... 862
"Жадные" и "ленивые" квантификаторы ........................................................................................... 863
Директивы нулевой длины .......................................................................................................................... 863
Просмотр вперед и просмотр назад ................................................................................................... 864
Якоря .................................................................................................................................................... 865
Границы слов ....................................................................................................................................... 866
Группы .......................................................................................................................................................... 866
Именованные группы .......................................................................................................................... 867
Замещение и разбивка на части .................................................................................................................. 868
Делегат MatchEvaluator ...................................................................................................................... 869
Разбивка текста .................................................................................................................................... 869
XXVI Îãëàâëåíèå
Сборник рецептов по регулярным выражениям ........................................................................................ 870
Рецепты ................................................................................................................................................ 870
Шаблон для номера социальной страховки или номера телефона в США .................................. 870
Извлечение пар "имя=значение" (по одной в строчке текста)....................................................... 870
Проверка сильного пароля................................................................................................................ 870
Строки длиной не менее 80 символов ............................................................................................. 870
Разбор даты и времени ...................................................................................................................... 871
Шаблон для римских чисел .............................................................................................................. 871
Удаление повторяющихся слов ........................................................................................................ 871
Подсчет слов ...................................................................................................................................... 872
Шаблон для глобального уникального идентификатора ................................................................ 872
Разбор XML-тега ............................................................................................................................... 872
Разбивка на части слова, написанного в стиле camel ..................................................................... 872
Получение допустимого имени файла ............................................................................................. 872
Экранирование символов Unicode для HTML-кода ....................................................................... 873
Справочник по языку регулярных выражений .......................................................................................... 873
Приложение 1. Ключевые слова языка C# ........................................................................... 879
Приложение 2. Соответствие сборок пространствам имен ............................................... 889
Предметный указатель ............................................................................................................. 899
Îá àâòîðàõ
Джозеф Албахари (Joseph Albahari) работает руководителем программных проек-
тов на C# в австралийской компании Egton Software Services, которая является
партнером крупнейшего производителя программных продуктов для здравоохране-
ния в Великобритании. Он более 15 лет занимается разработкой крупных коммер-
ческих приложений на .NET и других платформах для таких областей, как медици-
на, телекоммуникации и образование. Джозеф специализируется на создании за-
казных компонентов и написал прикладные платформы для трех компаний.
Бен Албахари (Ben Albahari) ранее работал менеджером программных проектов
в Microsoft, где он, в частности, занимался созданием .NET Compact Framework и
ADO.NET. Затем он стал соучредителем компании Genamics, поставляющей инст-
рументальные средства для программистов, работающих на C# и J++, а также про-
граммные продукты для анализа ДНК и белковых последовательностей. Он был
соавтором предыдущих изданий этой книги, а также "C# Essentials" ("Основы C#"),
первой книги издательства O'Reilly, посвященной этому языку.
2 Ãëàâà 9
Ïðåäèñëîâèå
Каждый выпуск C# и .NET Framework содержит новые функциональные возможно-сти и имеет больший потенциал для повышения производительности. Версия C# 3.0 содержит самые значительные изменения в языке за все время его развития, в том числе унифицированный синтаксис запросов, называемый LINQ (Language Integrated Query, запрос, интегрированный в язык). Он наводит мост между про-граммами и их источниками данных, традиционно отделяемым друг от друга. Он также приближает C# к функциональным языкам, таким как LISP и Haskell.
Платой за рост функциональности является необходимость изучить больший объем материала. Хотя такие инструменты, как IntelliSense от Microsoft (а также много-численные справочные материалы), отлично помогают справиться с этой задачей, все они предполагают наличие у читателя карты концептуального знания. Наша книга как раз и предлагает подобную карту в сжатом и унифицированном стиле, без излишней информации и длинных предисловий.
Это издание, в отличие от предыдущих, построено исключительно вокруг теорети-ческих концепций и практических примеров, что делает книгу пригодной как для последовательного чтения, так и для просмотра в произвольном порядке. Кроме того, изложение материала ведется более углубленно, чем ранее, поскольку рассчи-тано на читателя с более низким уровнем начальных знаний. Поэтому книга стала более понятной, чем предыдущие издания.
В книге описываются язык C#, среда CLR и сборки ядра Framework. Мы решили сосредоточиться на этих темах, чтобы уделить больше внимания таким трудным вопросам, как нити выполнения, безопасность и домены приложений. Мы специ-ально отмечаем функциональные возможности, впервые появившиеся в C# 3.0, и соответствующие нововведения во Framework, так что нашу книгу можно исполь-зовать и как справочник по C# 2.0.
Öåëåâàÿ àóäèòîðèÿ
Книга рассчитана на аудиторию с уровнем подготовки от среднего до высокого. Предварительное знакомство с языком C# не требуется, но определенный опыт программирования необходим. Для новичка книга может послужить дополнением к учебнику программирования (но не заменит его).
Даже если вы знаете C# 2.0, вы найдете для себя полезную информацию на более чем ста страницах, посвященных LINQ и другим нововведениям в C# 3.0. Кроме