C#与.NET 3.0 高级程序设计(英文版)
Часть 1 nnn Знакомство с C# и платформой .NET
ГЛАВА 1. Философия .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Понимание предыдущего положения дел. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Решение .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Знакомство со строительными блоками платформы .NET (CLR, CTS,
и ЦЛС). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Дополнительные языки программирования, поддерживающие .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Обзор сборок .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Понимание системы общих типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Понимание спецификации общего языка. . . . . . . . . . . . . . . . . . . . . . 20
Понимание общеязыковой среды выполнения. . . . . . . . . . . . . . . . . . . . . . . . . . 22
Различие сборки/пространства имен/типа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Исследование сборки с помощью ildasm.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Исследование сборки с помощью рефлектора Лутца Рёдера. . . . . . . . . . . . . . . . . . . . . . 31
Развертывание среды выполнения .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Независимая от платформы природа .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
ГЛАВА 2. Создание приложений на C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Роль пакета SDK для .NET Framework 3.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Создание приложений C# с использованием csc.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Создание приложений .NET с использованием TextPad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Создание .NET-приложений с помощью Notepad++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Создание .NET-приложений с помощью SharpDevelop. . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Создание приложений .NET с использованием Visual C# 2008 Express. . . . . . . . . . . . . . . . . . 50
Создание приложений .NET с помощью Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . 52
Частичный каталог дополнительных инструментов разработки .NET. . . . . . . . . . . . . . . . . . . . 64
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
iv
Часть 2 nnn Основные программные конструкции C#
ГЛАВА 3. Основные конструкции программирования на C#, часть I. . . . . . . . . . . . . . . . . . . . . . . . . 69
Анатомия простой программы на C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Интересное замечание: некоторые дополнительные члены
Класс System.Environment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Класс System.Console. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Системные типы данных и сокращенные обозначения C#. . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Понимание типа System.String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Сужение и расширение преобразований типов данных. . . . . . . . . . . . . . . . . . . . . . . . . . 95
Итерационные конструкции C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Конструкции принятия решений и операторы отношения/равенства. . . . . . . . . . . . . . . . . 102
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
ГЛАВА 4. Основные конструкции программирования на C#, часть II. . . . . . . . . . . . . . . . . . . . . . . . 107
Методы и модификаторы параметров. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Понимание перегрузки членов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Манипуляции с массивами в C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Понимание типа Enum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Понимание типа структуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Понимание типов значений и ссылочных типов. . . . . . . . . . . . . . . . . . . . . . . . 129
Типы значений и ссылок: последние подробности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Общие сведения о типах C#, допускающих значение NULL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
ГЛАВА 5 Определение типов инкапсулированных классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Знакомство с типом класса C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Понимание конструкторов классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Роль этого ключевого слова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Понимание статического ключевого слова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Определение столпов ООП. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Модификаторы доступа C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Первый столп: службы инкапсуляции C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Понимание постоянных данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Общие сведения о полях, доступных только для чтения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Понимание частичных типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Документирование исходного кода C# через XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Визуализация плодов нашего труда. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
ГЛАВА 6. Понимание наследования и полиморфизма. . . . . . . . . . . . . . . . . . 185
Основная механика наследования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Пересмотр диаграмм классов Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Второй столп: детали наследования. . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Программирование сдерживания/делегирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
nСОДЕРЖАНИЕ v
vi nСОДЕРЖАНИЕ
Третий столп: полиморфная поддержка C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Понимание правил приведения базового класса к производному классу. . . . . . . . . . . . . . . . . . . 210
Главный родительский класс: System.Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
ГЛАВА 7. Понимание структурированной обработки исключений. . . . . . . . . . . . . . . . . . . 219
Ода ошибкам, ошибкам и исключениям. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Роль обработки исключений .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Самый простой возможный пример. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Настройка состояния исключения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Исключения системного уровня (System.SystemException). . . . . . . . . . . . . . . . . . . . . 230
Исключения уровня приложения (System.ApplicationException). . . . . . . . . . . . . . . 231
Обработка нескольких исключений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Последний блок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Кто что бросает? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Результат необработанных исключений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Отладка необработанных исключений с помощью Visual Studio. . . . . . . . . . . . . . . . . . . . 242
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
ГЛАВА 8. Общие сведения о времени жизни объекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Классы, объекты и ссылки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Основы времени жизни объекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Роль корней приложений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Понимание генерации объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Тип System.GC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Создание финализируемых объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Создание одноразовых предметов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Создание финализируемых и одноразовых типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Часть 3 nnn Расширенные конструкции программирования на C#
ГЛАВА 9 Работа с интерфейсами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Понимание типов интерфейса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Определение пользовательских интерфейсов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Реализация интерфейса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Вызов членов интерфейса на уровне объекта. . . . . . . . . . . . . . . . . . . . . . . . . 276
Интерфейсы как параметры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Интерфейсы как возвращаемые значения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Массивы типов интерфейсов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Реализация интерфейсов с помощью Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . . 282
Разрешение конфликтов имен посредством явной реализации интерфейса. . . . . . . . . . . . . 283
Проектирование иерархии интерфейсов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Создание перечислимых типов (IEnumerable и IEnumerator). . . . . . . . . . . . . . . 289
Создание клонируемых объектов (ICloneable). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Создание сопоставимых объектов (IComparable). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Понимание интерфейсов обратного вызова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
ГЛАВА 10 Коллекции и дженерики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Интерфейсы пространства имен System.Collections. . . . . . . . . . . . . . . . . . . . . 309
Типы классов System.Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
System.Collections.Специализированное пространство имен. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Упаковка, распаковка и отношения System.Object. . . . . . . . . . . . . . . . . . . 316
Проблема типовой безопасности и строго типизированных коллекций. . . . . . . . . . . . . . . . . . 319
Пространство имен System.Collections.Generic. . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Создание пользовательских универсальных методов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Создание универсальных структур и классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Создание пользовательской универсальной коллекции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Создание универсальных базовых классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Создание универсальных интерфейсов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
ГЛАВА 11 Делегаты, события и лямбды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Понимание типа делегата .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Определение делегата в C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Базовые классы System.MulticastDelegate и System.Delegate. . . . . . . . . 344
Простейший пример делегата. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Дооснащение типа автомобиля делегатами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Более подробный пример делегата. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Понимание делегатной ковариации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Создание универсальных делегатов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Понимание событий C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Универсальный делегат EventHandler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Понимание анонимных методов C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Понимание преобразований групп методов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Лямбда-оператор C# 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
ГЛАВА 12 Индексаторы, операторы и указатели. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Понимание методов индексатора. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Понимание перегрузки операторов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Понимание пользовательских преобразований типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Работа с типами указателей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Директивы препроцессора C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
ГЛАВА 13 Возможности языка C# 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Понимание неявно типизированных локальных переменных. . . . . . . . . . . . . . . . . . . . . . . . . . 415
Понимание автоматических свойств. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Понимание методов расширения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
nСОДЕРЖАНИЕ vii
Понимание частичных методов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Понимание синтаксиса инициализатора объекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Понимание анонимных типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
ГЛАВА 14. Введение в LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Понимание роли LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Первый взгляд на выражения запроса LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
LINQ и универсальные коллекции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
LINQ и неуниверсальные коллекции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Внутреннее представление операторов запросов LINQ. . . . . . . . . . . . . . . . . . . . . 459
Исследование операторов запросов C# LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Запросы LINQ: остров для себя? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
ЧАСТЬ 4 nnn Программирование с помощью сборок .NET
ГЛАВА 15 Знакомство со сборками .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Определение пользовательских пространств имен. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Роль сборок .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Понимание формата сборки .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 482
Сборка и использование однофайловой сборки. . . . . . . . . . . . . . . . . . . . . . . . . 486
Сборка и использование многофайловой сборки. . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Понимание частных сборок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Понимание общих сборок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Использование общей сборки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Настройка общих сборок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Исследование внутреннего состава GAC. . . . . . . . . . . . . . . . . . . . . . . . 516
Общие сведения о сборках политики издателя. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Понимание элемента . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Пространство имен System.Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Файл конфигурации машины. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
ГЛАВА 16. Отражение типов, позднее связывание и использование атрибутов.
Программирование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Необходимость метаданных типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Понимание отражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Создание пользовательского средства просмотра метаданных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Динамическая загрузка сборок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Размышления об общих сборках. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Понимание позднего связывания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
viii nСОДЕРЖАНИЕ
Понимание атрибутивного программирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Создание пользовательских атрибутов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Атрибуты уровня сборки (и уровня модуля). . . . . . . . . . . . . . . . . . . . . . . . . . 549
Размышления об атрибутах с использованием раннего связывания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Размышления об атрибутах с использованием позднего связывания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Обзор отражения, позднего связывания и пользовательских атрибутов. . . . . . 553
Создание расширяемого приложения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
ГЛАВА 17 Процессы, домены приложений и контексты объектов. . . . . . . . . . . . . . . . . . . 561
Обзор традиционных процессов Win32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Взаимодействие с процессами на платформе .NET. . . . . . . . . . . . . . . . . . . . . . 563
Понимание доменов приложений .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Понимание границ контекста объекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Суммирование процессов, доменов приложений и контекста. . . . . . . . . . . . . . . . . . . . . . 581
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
ГЛАВА 18. Создание многопоточных приложений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Отношения Процесс/Домен приложения/Контекст/Поток. . . . . . . . . . . . . . . . . . . . 583
Краткий обзор .NET Delegate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Асинхронная природа делегатов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Асинхронный вызов метода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Пространство имен System.Threading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Класс System.Threading.Thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Программное создание вторичных потоков. . . . . . . . . . . . . . . . . . . . . . . . . . 597
Проблема параллелизма. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Программирование с использованием обратных вызовов таймера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Понимание ThreadPool CLR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Роль компонента BackgroundWorker. . . . . . . . . . . . . . . . . . . . . . . . . . 612
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
ГЛАВА 19. Понимание CIL и роль динамических сборок. . . . . . . . 617
Размышления о природе CIL-программирования. . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Изучение директив, атрибутов и кодов операций CIL. . . . . . . . . . . . . . . . . . . . . . . 618
Push and Popping: стековая природа CIL. . . . . . . . . . . . . . . . . . . . 620
Понимание двусторонней инженерии. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Понимание директив и атрибутов CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Библиотека базовых классов .NET, сопоставления типов данных C# и CIL. . . . . . . . . . . . . . . . 635
Определение членов типа в CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Изучение кодов операций CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Сборка сборки .NET с помощью CIL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Понимание динамических сборок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
СОДЕРЖАНИЕ ix
Часть 5 nnn Знакомство с библиотеками базовых классов .NET
ГЛАВА 20 Файловый ввод-вывод и изолированное хранилище. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Исследование пространства имен System.IO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Типы каталога(информация) и файла(информация). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Работа с типом DirectoryInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Работа с типом каталога. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Работа с типом класса DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Работа с классом FileInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Работа с типом файла. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Класс абстрактного потока. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Работа с StreamWriters и StreamReaders. . . . . . . . . . . . . . . . . . . . . . . . 677
Работа со StringWriters и StringReaders. . . . . . . . . . . . . . . . . . . . . . . . . . 680
Работа с BinaryWriters и BinaryReaders. . . . . . . . . . . . . . . . . . . . . . . . . . 682
Программный «просмотр» файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Выполнение асинхронного файлового ввода-вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Понимание роли изолированного хранилища. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Учебник по безопасности доступа к коду. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
Обзор изолированного хранилища. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Получение хранилища с помощью ИзолированныеStorageFile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Изолированное хранилище в действии: развертывание ClickOnce. . . . . . . . . . . . . . . . . . . . . . . . 707
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
ГЛАВА 21. Знакомство с сериализацией объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Понимание сериализации объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Настройка объектов для сериализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Выбор форматтера сериализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Сериализация объектов с использованием BinaryFormatter. . . . . . . . . . . . . . . . . . . . . . . . . . . 717
Сериализация объектов с использованием SoapFormatter. . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Сериализация объектов с помощью XmlSerializer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Сериализация коллекций объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
Настройка процесса сериализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
ГЛАВА 22 ADO.NET, часть I: подключенный уровень. . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Высокоуровневое определение ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Понимание поставщиков данных ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Дополнительные пространства имен ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
Типы пространства имен System.Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Абстрагирование поставщиков данных с помощью интерфейсов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Создание базы данных AutoLot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Модель фабрики поставщиков данных ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Понимание подключенного уровня ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . 755
Работа со считывателями данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Создание многоразовой библиотеки доступа к данным. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
x nСОДЕРЖАНИЕ
Создание интерфейса на основе консольного пользовательского интерфейса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Асинхронный доступ к данным с использованием SqlCommand. . . . . . . . . . . . . . . . . . . . . . . . . 775
Понимание транзакций базы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
ГЛАВА 23 ADO.NET, часть II: Отключенный уровень . . . . . . . . . . . . . . . . . . . . . . . . 783
Понимание отключенного уровня ADO.NET. . . . . . . . . . . . . . . . . . . . . . 783
Понимание роли набора данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Работа с столбцами данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Работа с DataRows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
Работа с таблицами данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Привязка объектов DataTable к пользовательским интерфейсам. . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Заполнение объектов DataSet/DataTable с использованием адаптеров данных. . . . . . . . . . . . . . . . . . . 808
Возвращаемся к AutoLotDAL.dll. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Навигация по объектам многотабличного набора данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
Инструменты доступа к данным Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Отделение автоматически сгенерированного кода от уровня пользовательского интерфейса. . . . . . . . . . . . . . . . . . . . . . . 831
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
ГЛАВА 24 Программирование с помощью LINQ API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
Роль LINQ для ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
Программирование с помощью LINQ to DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Программирование с помощью LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Генерация классов сущностей с помощью SqlMetal.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Создание классов сущностей с помощью Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . . . . . 854
Манипулирование XML-документами с использованием LINQ to XML. . . . . . . . . . . . . . . . . . . . . . . . 857
Навигация по документу в памяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
ГЛАВА 25 Знакомство с Windows Communication Foundation. . . . . . . . . . . . . . . 867
Попурри из API распределенных вычислений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867
Роль WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873
Исследование основных сборок WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Шаблоны проектов Visual Studio WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
Базовый состав приложения WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Азбука WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Создание службы WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Хостинг службы WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Создание клиентского приложения WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896
Использование шаблона проекта библиотеки служб WCF. . . . . . . . . . . . . . . . . . . . . . . . . 900
Размещение службы WCF в качестве службы Windows. . . . . . . . . . . . . . . . . . . . . . . . . 903
Асинхронный вызов службы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
Проектирование контрактов данных WCF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
nСОДЕРЖАНИЕ xi
ГЛАВА 26 Знакомство с Windows Workflow Foundation. . . . . . . . . . . . . . . . . . . . . 917
Определение бизнес-процесса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Строительные блоки WF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Сборки, пространства имен и проекты WF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
Создание простого приложения с поддержкой рабочего процесса. . . . . . . . . . . . . . . . . . . . . . . . . 926
Изучение кода хостинга WF Engine. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Вызов веб-служб в рабочих процессах. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Создание повторно используемой библиотеки кода WF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
Коротко о пользовательских действиях. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Часть 6. Пользовательские интерфейсы рабочего стола nnn
ГЛАВА 27 Программирование с помощью Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Пространства имен Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Создание простого приложения Windows Forms (без IDE). . . . . . . . . . . . . . . . . . 956
Шаблон проекта Visual Studio Windows Forms. . . . . . . . . . . . . . . . . . . . . . 961
Анатомия формы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Реакция на активность мыши. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Реагирование на действия клавиатуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977
Проектирование диалоговых окон. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
Рендеринг графических данных с использованием GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985
Создание полноценного приложения Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . 990
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
ГЛАВА 28 Знакомство с Windows Presentation Foundation и XAML. . . . . . . 999
Мотивация WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Различные варианты приложений WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Исследование сборок WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004
Создание приложения WPF (без XAML). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Дополнительные сведения о типе приложения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Дополнительные сведения о типе окна. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Создание (XAML-ориентированного) приложения WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
Преобразование разметки в сборку .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025
Разделение ответственности с помощью файлов кода программной части. . . . . . . . . . . . . . . . . . . . . . . 1029
Синтаксис XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Создание приложений WPF с использованием Visual Studio 2008. . . . . . . . . . . . . . . . . . . . . 1044
Обработка XAML во время выполнения: SimpleXamlPad.exe. . . . . . . . . . . . . . . . . . . . . . 1048
Роль Microsoft Expression Blend. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
xii nСОДЕРЖАНИЕ
ГЛАВА 29 Программирование с использованием элементов управления WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1055
Обзор библиотеки управления WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1055
Объявление элементов управления в XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Понимание роли свойств зависимостей. . . . . . . . . . . . . . . . . . . . . . 1060
Понимание перенаправленных событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1064
Работа с типами кнопок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068
Работа с флажками и радиокнопками. . . . . . . . . . . . . . . . . . . . . . . . . . . 1072
Работа с типами ListBox и ComboBox. . . . . . . . . . . . . . . . . . . . . . . . 1075
Работа с текстовыми областями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081
Управление макетом контента с помощью панелей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083
Создание рамы окна с использованием вложенных панелей. . . . . . . . . . . . . . . . . . . . . . . 1093
Понимание команд управления WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1099
Понимание модели привязки данных WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Преобразование данных с использованием IValueConverter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
Привязка к пользовательским объектам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1108
Привязка элементов пользовательского интерфейса к XML-документам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116
ГЛАВА 30. Двухмерная графическая визуализация, ресурсы и темы WPF. . . . . . . . . 1117
Философия служб графического рендеринга WPF. . . . . . . . . . . . . . . . . . . . 1117
Изучение типов, производных от фигуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Работа с кистями WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Работа с перьями WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11:30
Изучение типов, производных от чертежей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11:30
Роль трансформаций пользовательского интерфейса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Понимание анимационных служб WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
Понимание системы ресурсов WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1145
Определение и применение стилей для элементов управления WPF. . . . . . . . . . . . . . . . . . . . . . . . . 1147
Изменение пользовательского интерфейса элемента управления с помощью шаблонов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Часть 7 nnn Создание веб-приложений с помощью ASP.NET
ГЛАВА 31. Создание веб-страниц ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163
Роль HTTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163
Понимание веб-приложений и веб-серверов. . . . . . . . . . . . . . . . . . . . . . 1164
Роль HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1167
Роль сценариев на стороне клиента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Отправка данных формы (GET и POST). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
Создание классической страницы ASP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Проблемы с классическим ASP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Пространства имен ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1178
Модель кода веб-страницы ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179
Подробности структуры каталогов веб-сайта ASP.NET. . . . . . . . . . . . . . . . . . . . . . 1190
Цикл компиляции страницы ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
nСОДЕРЖАНИЕ xiii
Цепочка наследования типа страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Взаимодействие с входящим HTTP-запросом. . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Взаимодействие с исходящим HTTP-ответом. . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Жизненный цикл веб-страницы ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Роль файла Web.config. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1203
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206
ГЛАВА 32 Веб-элементы управления, темы и главные страницы ASP.NET. . . . . . . . . . . . 1207
Понимание природы веб-элементов управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1207
Тип System.Web.UI.Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1209
Тип System.Web.UI.WebControls.WebControl. . . . . . . . . . . . . . . . . . . . . . 1213
Основные категории веб-элементов управления ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
Создание многофункционального веб-сайта ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Роль средств контроля валидации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1231
Работа с темами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1237
Размещение элементов управления с помощью таблиц HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1243
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
ГЛАВА 33. Методы управления состоянием ASP.NET. . . . . . . . . . . . . . . . . . . . . . . 1245
Вопрос государства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1245
Методы управления состоянием ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1247
Понимание роли состояния представления ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . 1248
Роль файла Global.asax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1251
Понимание различий между приложением и сеансом. . . . . . . . . . . . . . . . . . . . . . 1254
Работа с кэшем приложения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Ведение данных сеанса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263
Понимание файлов cookie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1267
Роль элемента . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
Понимание API профиля ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1272
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Часть 8 nnn Приложения
ПРИЛОЖЕНИЕ А. Совместимость COM и .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1283
Область совместимости .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1283
Простой пример взаимодействия .NET с COM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1284
Исследование сборки взаимодействия .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1287
Понимание вызываемой оболочки среды выполнения. . . . . . . . . . . . . . . . . . . . . . . . . . 1289
Роль COM IDL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Использование библиотеки типов для создания сборки взаимодействия. . . . . . . . . . . . . . . . . . . . . . 1296
Создание более сложного COM-сервера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1299
Изучение сборки Interop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Понимание совместимости COM и .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
Роль КОО. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1306
Роль интерфейса классов .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
xiv nСОДЕРЖАНИЕ
Создание типов .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1308
Создание библиотеки типов и регистрация типов .NET. . . . . . . . . . . . . . 1310
Проверка экспортированной информации о типе. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Создание тестового клиента Visual Basic 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1312
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1313
nПРИЛОЖЕНИЕ B Платформонезависимая разработка .NET с использованием Mono . . . . . . . . . . . 1315
Независимая от платформы природа .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315
Получение и установка Mono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Инструменты разработки Mono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1321
Создание .NET-приложений с помощью Mono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Предложения для дальнейшего изучения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13:30
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1331
нИНДЕКС. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1333
Расширять