Иллюстрированный самоучитель по Architecture .NET

Классы каркаса .NET Framework

  • Классы каркаса .NET Framework

    Невозможно описать в одной главе, или даже в одной книге, все классы каркаса .NET Framework. Хотя и не полностью, классы .NET охватывают большую часть интерфейса 32-разрядных Windows-приложений (Win32 API), так же как и много чего другого.
  • Метаданные и отражение

    Пример Serialization (Сериализация) из главы 2 "Основы технологии .NET" демонстрирует, как благодаря метаданным общеязыковая среда времени выполнения CLR поддерживает работу сервисов. Многие из технологий, которые мы рассматриваем в других главах книги, основаны на метаданных, хотя мы не всегда будем акцентировать на этом внимание.
  • Класс туре (Тип)

    Абстрактный класс Type (Тип) в пространстве имен System (Система) определяет типы .NET. Поскольку в .NET нет никаких функций вне классов или глобальных переменных, то получив все типы в сборке, мы получим все метаданные о коде в этой сборке.
  • Динамическое связывание

    Отражение может также использоваться для реализации динамического связывания. Динамическое связывание состоит в том, что метод, который нужно вызвать, определяется в процессе выполнения, а не на этапе компиляции.
  • Ввод и вывод в .NET. Потоковые классы.

    Грубо обобщая, можно разделить функции ввода/вывода в каркасе .NET Framework на две широких категории, не зависящих от устройства хранения данных (диск, память, и т.д.): это запись и чтение. | Данные могут рассматриваться как поток байтов или символов.
  • Примитивные типы данных и потоки. TextReader и TextWriter.

    Классы, производные от Stream (Поток, Абстрактный последовательный файл), целесообразно использовать тогда, когда нужно читать или писать байты данных блоками. Если необходимо прочитать в поток или записать из потока простой тип, такой как Boolean (булев, логический), String (Строка) или Int32, следует использовать классы BinaryReader и BinaryWriter.
  • Обработка файлов

    Каркас содержит два класса File (Файл) и File Info, которые очень полезны для работы с файлами. Класс File (Файл) предоставляет основные функциональные возможности для обработки файлов в дополнение к операциям чтения и записи.
  • Сериализация, или преобразование в последовательную форму

    Сохранение сложной структуры данных со связанными объектами может стать довольно громоздким при использовании классов File (Файл) и Stream (Поток, Абстрактный последовательный файл). Необходимо сохранить все индивидуальные поля на диске.
  • Объекты сериализации

    Хотя каркас знает, как сохранять объект, помеченный атрибутом Serializable (Преобразуемый в последовательную форму), но все же необходимо определить формат, в котором будет сохранен объект, и носитель данных.
  • ISerializable

    Иногда методов преобразования в последовательную форму (сериализации), предоставляемых каркасом, недостаточно. В таком случае можно предусмотреть специальную сериализацию класса. Для этого необходимо реализовать интерфейс ISerializable и добавить к классу конструктор, как это показано в проекте Serialization (Сериализация) в папке ISerializable.
  • Модель приложений .NET. Потоки.

    Сериализация дала конкретный пример гибкости среды каркаса .NET Framework, используемой при написании кода. Теперь давайте рассмотрим модель, в которой выполняются .NET-приложения. Среда платформы Win32, в которой выполняется программа, называется ее процессом. Эта среда состоит из:
  • Изоляция потоков

    Исключение, сгенерированное одним потоком, не приведет к отказу в работе другого потока. Пример Threadlsolation демонстрирует это. | _gc class tm | // класс сборщика мусора tm | { | public: | void m() { | Console::WriteLine( | "Thread {0} started", // "Поток {0} начал работу", | Thread::CurrentThread › GetHashCode().ToString()); | Thread::Sleep(1000); // Поток:: Бездействует forfint i = 0; i < 10;
  • Синхронизация коллекций. Контекст.

    Некоторые списки, например TraceListeners, являются безопасными с точки зрения работы с потоками. Во время изменения этой коллекции изменяется копия и устанавливается ссылка на копию. Большинство коллекций, подобных ArrayList (Список массивов), небезопасны при работе с потоками.
  • Заместители и заглушки

    Как же во время выполнения удается удовлетворить различные требования различных контекстов? Когда какой-нибудь объект располагается в другом контексте (например, объект HotelBroker в экземпляре NewResevation), взамен указателя непосредственно на сам объект, возвращается указатель на некоторый заместитель. Реальный объект постоянно находится в своем первоначальном контексте.
  • ContextBoundObject. Изоляция приложений.

    Класс Broker (Брокер) должен быть производным от класса ContextBoundObject, чтобы во время выполнения можно было определить, требуется ли установить новый контекст.
  • Прикладная область. Прикладные области и сборки.

    Прикладная область .NET (Application Domain, иногда называемая AppDomain) – это более простой способ изоляции приложений, безопасный и устойчивый к ошибкам. В рамках одного процесса может находиться несколько прикладных областей.
  • Класс AppDomain (Прикладная область). События AppDomain (Прикладная область).

    Класс AppDomain (Прикладная область) реализует абстракцию прикладной области. Пример AppDomain (Прикладная область) иллюстрирует использование прикладных областей. Этот класс имеет статические методы для создания и разгрузки прикладных областей: | AppDomain *domain = AppDomain::CreateDomain( | "CreatedDomain2", 0, 0); | AppDomain::Unload(domain);
  • Пример AppDomain (Прикладная область)

    При выполнении примера AppDomain (Прикладная область) получается выдача, показанная на рис. 8.1. | Рис. 8.1. Выдача в примере AppDomain (Прикладная область) | Сначала выводится имя, поток и контекст прикладной области, заданной по умолчанию: | AppDomain *currentDomain = AppDomain:: CurrentDomam;
  • Маршализация, прикладные области и контексты. Асинхронное программирование. Асинхронные шаблоны проектирования .lAsyncResult.

    По умолчанию объекты копируются из одной прикладной области в другую (передаются по значению). В разделе "Удаленный доступ" показано, как происходит передача по ссылке между прикладными областями. Это гарантирует изоляцию кода одной прикладной области от кода другой.
  • Использование делегатов в асинхронном программировании

    Каждый разработчик объектов .NET, желающий предоставить асинхронный интерфейс, должен следовать только что описанному шаблону. Однако большинству разработчиков не нужно разрабатывать собственное решение для асинхронного интерфейса к своим объектам.
  • Организация поточной обработки с параметрами. Удаленный доступ.

    Асинхронный обратный вызов выполняется в потоке, отличном от того, в котором был сделан вызов Beginlnvoke. Если требования к организации поточной обработки просты, то для передачи параметров функциям потока можно использовать асинхронные делегаты.
  • Краткий обзор удаленного доступа

    Ниже перечислены ключевые части удаленного доступа: | перехват, с помощью которого генерируются сообщения для связи по каналам; | форматеры (Formatters), служащие для помещения сообщения в байтовый поток, который посылается по каналу.
  • Удаленные объекты

    Клиентская часть организовывает заместитель, активизируя (вызывая) удаленный объект. Удаленные объекты должны быть производными от MarshalByRefObject, потому что вы работаете с заместителем объектной ссылки, а не непосредственно с самой объектной ссылкой.
  • Активация. Пример удаленного объекта.

    Объекты активизируются на стороне клиента одним из трех способов, используя класс Activator (Активатор, Модуль активизации). | Activator::GetObject используется для получения ссылки на активизированный сервером объект.
  • Пример программы, реализующей удаленный доступ

    В примере Remoting клиент обращается к активизированному сервером объекту. Сервер – это класс TcpServerChannel, использующий двоичный формат с протоколом управления передачей TCP. Канал будет использовать порт 8085.
  • Метаданные и удаленный доступ. Конфигурационные файлы удаленного доступа. Программируемые атрибуты.

    Для того чтобы запросить объект определенного типа, клиенту должны быть доступны метаданные о типе. В примере программы удаленного доступа, рассмотренной в этой главе, просто делается ссылка на реальную сборку, в которой хранится объект.
  • Использование самостоятельно созданного атрибута

    Перед тем как обсудить реализацию собственного атрибута, рассмотрим, как используется атрибут InitialDirectory. Чтобы указать начальный каталог для класса, мы сделаем класс производным от базового класса DirectoryContext.
  • Определение класса атрибута. Определение базового класса.

    Чтобы создать пользовательский атрибут, необходимо определить класс атрибута, производный от базового класса Attribute (Атрибут). В соответствии с соглашением, нужно дать классу имя, заканчивающееся на "Attribute" ("Атрибут").
  • Сборка мусора. Уничтожение объектов.

    Распределенная управляемая память автоматически возвращается системе с помощью алгоритма сборки мусора. Общеязыковая среда времени выполнения CLR отслеживает использование памяти, которая выделяется в управляемой ею динамически распределяемой области памяти, и любой участок памяти, на который больше ничто не ссылается, отмечается как "мусор".
  • Неуправляемые ресурсы и освобождение ранее выделенной области памяти

    Предположим, что некоторый объект, с помощью которого был открыт файл, программе больше не нужен и помечен для сборки мусора. В конечном счете будет вызван деструктор объекта, при выполнении которого файл может быть закрыт.
  • Поколения. Завершение и раскручивание стека.

    Чтобы оптимизировать технологию, каждому объекту, находящемуся в управляемой динамически распределяемой области памяти, назначается поколение. Так, новому объекту назначается поколение 0, и такой объект рассматривается в качестве главного кандидата для сборки мусора.
  • Управление сборкой мусора с помощью класса сборщика мусора GC

    Обычно лучше всего не вмешиваться в работу сборщика мусора, – пусть он выполняет свою работу незаметно для вас. Иногда, однако, программе может быть выгодно вмешаться в его работу. Пространство имен System (Система) содержит класс GC (Сборщик мусора), который дает возможность программе изменить поведение сборщика мусора. Мы рассмотрим несколько важных методов класса GC (Сборщик мусора).
  • Программа-пример. Резюме.

    Программа GarbageCollection (Сборка мусора) иллюстрирует использование рассмотренных выше методов класса GC (Сборщик мусора). Пример несколько искусственен. С его помощью просто иллюстрируется продолжительность жизни объекта и эффект использования различных методов класса GC (Сборщик мусора).
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.