Эта книга - подробное описание внутреннего устройства и функционирования общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 2.0. В ней раскрыта система типов .NET Framework и разъяснены способы управления ими. Представлены концепции программирования с широким использованием библиотеки FCL, относящиеся ко всем языкам, ориентированным на работу с .NET Framework. Особое внимание уделено обобщениям, управлению асинхронными операциями и синхронизации потоков. Книга ориентирована на разработчиков любых видов приложений на платформе с .NET Framework: Windows Forms, Web Forms, Web-сервисов, консольных приложений и пр. Книга состоит из 24 глав.
Содержание
Введение
Платформа разработки: .NET Framework
Среда разработки: Microsoft Visual Studio
Цель этой книги
Примеры кода и системные требования
В этой книге нет ошибок
Благодарности
Поддержка
Предисловие
Часть I
Основы CLR
Глава 1 Модель выполнения кода в среде CLR
Компиляция исходного кода в управляемые модули
Объединение управляемых модулей в сборку
Загрузка CLR
Исполнение кода сборки
IL и верификация
Небезопасный код
IL и защита интеллектуальной собственности
NGen.exe - генератор объектного кода
Библиотека классов .NET Framework
Общая система типов
Общеязыковая спецификация
Взаимодействие с неуправляемым кодом
Глава 2 Компоновка, упаковка, развертывание
и администрирование приложений и типов
Задачи развертывания в .NET Framework
Компоновка типов в модуль
Файл параметров
Несколько слов о метаданных
Объединение модулей для создания сборки
Добавление сборок в проект в среде Visual Studio
Использование утилиты Assembly Linker
Включение в сборку файлов ресурсов
Ресурсы со сведениями о версии сборки
Номера версии
Региональные стандарты
Развертывание простых приложений (закрытое развертывание сборок)
Простое средство администрирования (конфигурационный файл)
Глава 3 Совместно используемые сборки
и сборки со строгим именем
Два вида сборок - два вида развертывания
Назначение сборке строгого имени
Глобальный кеш сборок
Внутренняя структура GAC
Компоновка сборки, ссылающейся на сборку со строгим именем
Устойчивость сборок со строгими именами к несанкционированной
модификации
Отложенное подписание
Закрытое развертывание сборок со строгими именами
Как исполняющая среда разрешает ссылки на типы
Дополнительные административные средства (конфигурационные файлы)
Управление версиями при помощи политики издателя
Часть II
Работаем с типами
Глава 4 Основы типов
Все типы - производные от System.Object
Приведение типов
Приведение типов в C# с помощью операторов is и as
Пространства имен и сборки
Как разные компоненты взаимодействуют во время выполнения
Глава 5 Элементарные, ссылочные и значимые типы
Элементарные типы в языках программирования
Проверяемые и непроверяемые операции для элементарных типов
Ссылочные и значимые типы
Упаковка и распаковка значимых типов
Изменение полей в упакованных размерных типах посредством интерфейсов
Равенство и тождество объектов
Хеш-коды объектов
Часть III
Проектирование типов
Глава 6 Основные сведения о членах и типах
Члены типа
Видимость типа
Дружественные сборки
Доступ к членам
Статические классы
Частичные классы, структуры и интерфейсы
Компоненты, полиморфизм и версии
Вызов виртуальных методов, свойств и событий в CLR
Разумное использование видимости типов
и модификаторов доступа к членам
Работа с виртуальными методами при управлении версиями типов
Глава 7 Константы и поля
Константы
Поля
Глава 8 Методы: конструкторы, операторы,
преобразования и параметры
Конструкторы экземпляров и классы (ссылочные типы)
Конструкторы экземпляров и структуры (значимые типы)
Конструкторы типов
Производительность конструкторов типа
Методы перегруженных операторов
Операторы и взаимодействие языков программирования
Методы операторов преобразования
Передача методу параметров по ссылке
Передача методу переменного числа параметров
Объявление типов параметров метода
Методы-константы и параметры-константы
Глава 9 Свойства
Свойства без параметров
Осторожный подход к определению свойств
Свойства с параметрами
Производительность при вызове аксессоров свойств
Доступность аксессоров свойств
Обобщенные методы-аксессоры свойств
Глава 10 События
Проектирование типа, поддерживающего событие
Этап 1: определение типа, который будет хранить
всю дополнительную информацию, передаваемую
получателям уведомления о событии
Этап 2: определение члена-события
Этап 3: определение метода, ответственного
за уведомление зарегистрированных объектов о событии
Этап 4: определение метода, транслирующего входную
информацию в желаемое событие
Как реализуются события
Создание типа, отслеживающего событие
События и безопасность потоков
Явное управление регистрацией событий
Конструирование типа с множеством событий
Часть IV
Важнейшие типы
Глава 11 Символы, строки и обработка текста
Символы
Тип System.String
Создание строк
Строки не изменяются
Сравнение строк
Интернирование строк
Создание пулов строк
Работа с символами и текстовыми элементами в строке
Прочие операции со строками
Эффективное создание строки динамически
Создание объекта StringBuilder
Члены StringBuilder
Получение строкового представления объекта
Форматы и региональные стандарты
Форматирование нескольких объектов в одну строку
Создание собственного средства форматирования
Получение объекта посредством разбора строки
Кодировки: преобразования между символами и байтами
Кодирование и декодирование потоков символов и байт
Кодирование и декодирование строк в кодировке Base-64
Защищенные строки
Глава 12 Перечислимые типы и битовые флаги
Перечислимые типы
Битовые флаги
Глава 13 Массивы
Приведение типов в массивах
Все массивы неявно наследуют классу System.Array
Все массивы неявно реализуют IEnumerable, ICollection и IList
Передача и возврат массивов
Создание массивов с ненулевой нижней границей
Производительность доступа к массиву
Небезопасный доступ к массивам и массивы фиксированного размера
Глава 14 Интерфейсы
Наследование в классах и интерфейсах
Определение интерфейсов
Наследование интерфейсов
Подробнее о вызовах интерфейсных методов
Явные и неявные реализации методов
интерфейса (что происходит за кулисами)
Обобщенные интерфейсы
Обобщения и ограничение интерфейса
Реализация нескольких интерфейсов с одинаковыми
сигнатурами и именами методов
Улучшение контроля типов при помощи явной реализации
методов интерфейса
Осторожно с явной реализацией методов интерфейсов!
Дилемма проектировщика: базовый класс или интерфейс?
Глава 15 Делегаты
Знакомство с делегатами
Использование делегатов для обратного вызова статических методов
Использование делегатов для обратного вызова экземплярных методов
Правда о делегатах
Использование делегатов для обратного вызова множественных
методов (цепочки делегатов)
Поддержка цепочек делегатов в C#
Расширенное управление цепочкой делегатов
Упрощение синтаксиса работы с делегатами в C#
Упрощенный синтаксис ? 1: не нужно создавать объект-делегат
Упрощенный синтаксис ? 2: не нужно определять
метод обратного вызова
Упрощенный синтаксис ? 3: не нужно определять
параметры метода обратного вызова
Упрощенный синтаксис ? 4: не нужно вручную
создавать обертку локальных переменных класса
для передачи их в метод обратного вызова
Делегаты и отражение
Глава 16 Обобщения
Обобщения в библиотеке FCL
Библиотека Power Collections от Wintellect
Инфраструктура обобщений
Открытые и закрытые типы
Обобщенные типы и наследование
Проблемы с идентификацией и тождеством обобщенных типов
"Распухание" кода
Обобщенные интерфейсы
Обобщенные делегаты
Обобщенные методы
Логический вывод обобщенных методов и типов
Обобщения и другие члены
Верификация и ограничения
Основные ограничения
Дополнительные ограничения
Ограничения конструктора
Другие вопросы верификации
Глава 17 Нестандартные атрибуты
Применение нестандартных атрибутов
Определение собственного класса атрибутов
Конструктор атрибута и типы данных полей/свойств
Обнаружение использования нестандартных атрибутов
Сравнение двух экземпляров атрибута
Обнаружение использования нестандартных атрибутов
без создания объектов, производных от Attribute
Условные атрибутные классы
Глава 18 Значимые типы, допускающие присвоение null
Поддержка значимых типов, допускающих присвоение null, в C#
Оператор интеграции null в языке C#
CLR обеспечивает специальную поддержку значимых типов,
допускающих присвоение null
Упаковка значимых типов, допускающих присвоение null
Распаковка значимых типов, допускающих присвоение null
Вызов GetType через значимый тип, допускающий присвоение null
Вызов интерфейсных методов через значимый тип,
допускающий присвоение null
Часть V
Средства CLR
Глава 19 Исключения
Эволюция обработки исключений
Механика обработки исключений
Блок try
Блок catch
Блок finally
Общеязыковая спецификация (CLS) и исключения,
отличные от CLS-совместимых
Что же это такое - исключение?
Класс System.Exception
Классы исключений, определенные в FCL
Генерация исключений
Определение собственных классов исключений
Как правильно использовать исключения
Проверяйте аргументы своих методов
Блоков finally не должно быть слишком много
Не всякое исключение следует перехватывать
Корректное восстановление после исключения
Отмена незавершенных операций при невосстановимых исключениях
Сокрытие деталей реализации для сохранения контракта
Вопросы быстродействия
Необработанные исключения
Трассировка стека при исключениях
Отладка исключений
Глава 20 Автоматическое управление памятью (сбор мусора)
Основы работы платформы, поддерживающей сбор мусора
Выделение ресурсов из управляемой кучи
Алгоритм сбора мусора
Сбор мусора и отладка
Использование завершения для освобождения машинных ресурсов
Гарантированное завершение с использованием типов
CriticalFinalizerObject
Тип SafeHandle и его производные
Взаимодействие с неуправляемым кодом с помощью
типов SafeHandle
Применение завершения к управляемым ресурсам
Когда вызываются методы Finalize
Внутренний механизм завершения
Модель освобождения ресурсов: принудительная очистка объекта
Использование типов, поддерживающих модель освобождения ресурсов
Оператор using языка C#
Интересная проблема с зависимостью
Ручной мониторинг и управление временем жизни объектов
Воскрешение
Поколения
Другие возможности сборщика мусора по работе
с машинными ресурсами
Прогнозирование успеха операции, требующей много памяти
Управление сборщиком мусора из программ
Другие вопросы производительности сборщика мусора
Выделение памяти без синхронизации
Масштабируемый параллельный сбор мусора
Параллельный сбор мусора
Большие объекты
Мониторинг сбора мусора
Глава 21 Хостинг CLR и домены приложения (AppDomains)
Хостинг CLR
Домены приложения
Доступ к объектам из другого AppDomain
Выгрузка доменов AppDomain
Как хосты используют домены AppDomain
Консольные приложения и приложения Windows Forms
Microsoft Internet Explorer
Web-формы ASP.NET и Web-сервисы XML
Microsoft SQL Server 2005
Будущее и мечты
Другие методы управления хостом
Управление CLR с помощью управляемого кода
Создание надежного приложения-хоста
Как поток возвращается в хост
Глава 22 Загрузка сборок и отражение
Загрузка сборок
Использование отражения для создания динамически
расширяемых приложений
Производительность отражения
Обнаружение типов, определенных в сборке
Что же из себя представляет объект-тип
Создание иерархии типов, производных от Exception
Создание экземпляра типа
Создание приложений с поддержкой подключаемых компонентов
Использование отражения для обнаружения членов типа
Обнаружение членов типа
BindingFlags: фильтрация типов возвращаемых членов
Обнаружение интерфейсов типа
Вызов членов типа
Один раз привяжись, семь раз вызови
Использование описателей привязки
для уменьшения рабочего набора
Глава 23 Асинхронные операции
Потоки Windows в CLR
К вопросу об эффективном использовании потоков
Пул потоков в CLR
Ограничение числа потоков в пуле
Использование пула потоков для выполнения асинхронных
вычислительных операций
Использование выделенного потока
для выполнения асинхронной операции
Периодическое выполнение асинхронной операции
История трех таймеров
Модель асинхронного программирования
Использование модели APM для выполнения асинхронного ввода-вывода
Три метода стыковки в модели APM
Стыковка с использованием ожидания завершения
Стыковка с использованием регулярного опроса
Стыковка путем обратного вызова метода
Использование модели APM для выполнения асинхронных вычислительных операций
Модель APM и исключения
Важные замечания о модели APM
Контексты выполнения
Глава 24 Синхронизация потоков
Целостность памяти, временный доступ к памяти и volatile-поля
Временная запись и чтение
Поддержка volatile-полей в C#
Семейство Interlocked-методов
Класс Monitor и блоки синхронизации
"Отличная" идея
Реализация "отличной" идеи
Использование класса Monitor для управления
блоком синхронизации
Способ синхронизации, предлагаемый Microsoft
Упрощение кода C# при помощи оператора lock
Способ синхронизации статических членов,
предлагаемый Microsoft
Почему же "отличная" идея оказалась такой неудачной
Знаменитый способ блокировки с двойной проверкой
Класс ReaderWriterLock
Использование объектов ядра Windows в управляемом коде
Вызов метода при освобождении одного объекта ядра