
- •Сборки (assembly) в среде .Net. Проблема версионности сборок и ее решение.
- •Номер версии в .Net
- •Сведения о версии
- •Номер версии сборки
- •Информационная версия сборки
- •Общая система типов данных в среде .Net. Размерные и ссылочные типы данных. Типы, переменные и значения
- •Пользовательские типы
- •Система общих типов cts
- •Ссылочные типы
- •Типы литеральных значений
- •Неявные типы, анонимные типы и типы, допускающие значение null
- •Упаковка и распаковка размерных типов данных в среде .Net.
- •Производительность
- •Упаковка–преобразование
- •Распаковка-преобразование
- •Ссылочные типы данных. Объектная модель в среде .Net и языке c#.
- •Модели ручной и автоматической утилизации динамической памяти, их сравнительная характеристика. Модель с ручным освобождением памяти
- •Модель с автоматической «сборкой мусора»
- •Модель автоматической утилизации динамической памяти, основанная на сборке мусора. Проблема недетерминизма.
- •Модель автоматической утилизации динамической памяти, основанная на аппаратной поддержке (тегированной памяти).
- •Сборка мусора в среде .Net. Построение графа достижимых объектов.
- •Сборка мусора в среде .Net. Механизм поколений объектов.
- •Модель детерминированного освобождения ресурсов в среде .Net. Интерфейс iDisposable и его совместное использование с завершителем (методом Finalize).
- •«Мягкие ссылки» и кэширование данных в среде .Net.
- •Краткие и длинные слабые ссылки
- •Краткая ссылка
- •Длинная ссылка
- •Правила использования слабых ссылок
- •Динамические массивы в среде .Net и языке c#.
- •Приведение типов в массивах
- •Все массивы неявно реализуют /Enumerable, /Collection и iList
- •Передача и возврат массивов
- •Создание массивов с ненулевой нижней границей
- •Производительность доступа к массиву
- •Небезопасный доступ к массивам и массивы фиксированного размера
- •Делегаты в среде .Net и механизм их работы. Знакомство с делегатами
- •Использование делегатов для обратного вызова статических методов
- •Использование делегатов для обратного вызова экземплярных методов
- •Правда о делегатах
- •Использование делегатов для обратного вызова множественных методов (цепочки делегатов)
- •Поддержка цепочек делегатов в с#
- •Расширенное управление цепочкой делегатов
- •Упрощение синтаксиса работы с делегатами в с#
- •Упрощенный синтаксис № 1: не нужно создавать объект-делегат
- •Упрощенный синтаксис № 2: не нужно определять метод обратного вызова
- •Упрощенный синтаксис № 3: не нужно определять параметры метода обратного вызова
- •Упрощенный синтаксис № 4: не нужно вручную создавать обертку локальных переменных класса для передачи их в метод обратного вызова
- •Делегаты и отражение
- •События в среде .Net; реализация событий посредством делегатов. События
- •Этап 1: определение типа, который будет хранить всю дополнительную информацию, передаваемую получателям уведомления о событии
- •Этап 2: определение члена-события
- •Этап 3: определение метода, ответственного за уведомление зарегистрированных объектов о событии
- •Этап 4: определение метода, транслирующего входную информацию в желаемое событие
- •Как реализуются события
- •Создание типа, отслеживающего событие
- •События и безопасность потоков
- •Явное управление регистрацией событий
- •Конструирование типа с множеством событий
- •Исключительные ситуации и реакция на них в среде .Net. Достоинства
- •Механика обработки исключений
- •Блок try
- •Блок catch
- •Блок finally
- •Генерация исключений
- •Определение собственных классов исключений
- •Исключения в платформе .Net Framework
- •Исключения и традиционные методы обработки ошибок
- •Управление исключениями средой выполнения
- •Фильтрация исключений среды выполнения
- •21 Средства многопоточного программирования в среде .Net. Автономные потоки. Пул потоков.
- •Создание и использование потоков
- •Запуск и остановка потоков
- •Методы управления потоками
- •Безопасные точки
- •Свойства потока
- •Потоки Windows в clr
- •К вопросу об эффективном использовании потоков
- •Пул потоков в clr
- •Ограничение числа потоков в пуле
- •22. Асинхронные операции в среде .Net. Асинхронный вызов делегатов.
- •23. Синхронизация программных потоков в среде .Net. Блокировки.
- •Двойная блокировка
- •Класс ReaderWriterLock
- •Использование объектов ядра Windows в управляемом коде
- •Вызов метода при освобождении одного объекта ядра
- •24. Синхронизация программных потоков в среде .Net. Атомарные (Interlocked-операции). Семейство lnterlocked-методов
- •25. Прерывание программных потоков в среде .Net. Особенности исключительной ситуации класса ThreadAbortException.
- •26. Мониторы в среде .Net. Ожидание выполнения условий с помощью методов Wait и Pulse. Класс Monitor и блоки синхронизации
- •«Отличная» идея
- •Реализация «отличной» идеи
- •Использование класса Monitor для управления блоком синхронизации
- •Способ синхронизации, предлагаемый Microsoft
- •Упрощение кода c# при помощи оператора lock
- •Способ синхронизации статических членов, предлагаемый Microsoft
- •Почему же «отличная» идея оказалась такой неудачной
- •Целостность памяти, временный доступ к памяти и volatile-поля
- •Временная запись и чтение
- •Поддержка volatile-полей в с#
- •27. Асинхронный вызов делегатов.
- •Общие типы (Generics)
- •Инфраструктура обобщений
- •Открытые и закрытые типы
- •Обобщенные типы и наследование
- •Проблемы с идентификацией и тождеством обобщенных типов
- •«Распухание» кода
- •Обобщенные интерфейсы
- •Обобщенные делегаты
- •Обобщенные методы
- •Логический вывод обобщенных методов и типов
- •Обобщения и другие члены
- •Верификация и ограничения
- •Основные ограничения
- •Дополнительные ограничения
- •Ограничения конструктора
- •Другие вопросы верификации
- •Приведение переменной обобщенного типа
- •Присвоение переменной обобщенного типа значения по умолчанию
- •Сравнение переменной обобщенного типа с null
- •Сравнение двух переменных обобщенного типа
- •Использование переменных обобщенного типа в качестве операндов
- •Преимущества использования общих типов
- •29. Итераторы в среде .Net. Создание и использование итераторов.
- •Общие сведения о итераторах
Блок finally
Блок finally содержит код, исполнение которого гарантируется. Обычно этот код выполняет операции очистки, необходимые в результате выполненных в блоке try действий. Так, если в блоке try был открыт файл, то в блоке, finally должен быть код, закрывающий этот файл.
Если код из блока try не вызовет исключение, то файл гарантированно будет закрыт; и, даже если возникнет исключение, код из блока finally будет выполнен, а файл — закрыт независимо от того, перехвачено ли исключение. Не следует помещать оператор, закрывающий файл, после блока finally — он не будет исполнен, если сгенерированное исключение не будет перехвачено, и в итоге файл останется открытым.
Вовсе не обязательно, чтобы с блоком try был связан блок finally. Иногда код в блоке try просто не требует никакого кода для очистки. Но если блок finally все же имеется, он должен размещаться после всех блоков catch, причем блоку try может соответствовать не более одного блока finally.
Дойдя до конца кода в блоке finally, поток просто начинает исполнять операторы, расположенные за блоком finally. Код в блоке finally предназначен для очистки и должен делать только то, что необходимо для отмены операций, начатых в блоке try. Избегайте в блоке finally кода, способного сгенерировать исключение. Но даже если возникло исключение в блоке finally, это еще не конец света — механизм обработки исключений среды CLR продолжит исполнение, как будто бы исключение было сгенерировано после блока finally. Но при этом CLR напрочь «забудет» об исходном исключении, возникшем в блоке try (если таковое было), и вся информация (в частности, трассировочный след в стеке вплоть до исключения) о таком исключении будет потеряна.
Генерация исключений
Создавая собственные методы, вы вправе генерировать исключения, если метод не в состоянии выполнить задачу, на которую указывает его имя. При этом нужно ответить на два важных вопроса.
■ Какой производный от Exception тип исключения будет генерироваться? Настоятельно рекомендуется выбирать содержательный тип. Представьте себе код, расположенный выше в стеке вызовов, и как тот код должен узнать, что метод потерпел неудачу, чтобы выполнить корректное восстановление после сбоя. Можно задействовать тип, уже определенный в FCL, но может быть, что в FCL нет типа, полностью соответствующего нужной семантике. Поэтому придется определять собственный тип, непосредственно наследующий SystemException. Если нужно определить иерархию типов исключений, настоятельно рекомендуется создавать максимально плоскую и широкую иерархию, чтобы свести до минимума число базовых классов. Причина в том, что базовые классы действуют так, чтобы обеспечить обработку многих ошибок как одной ошибки, и это обычно опасно. Таким образом, никогда не следует генерировать тип SystemException и надо соблюдать максимальную осторожность при генерации любого другого типа исключений, являющегося базовым классом.
■ Какое строковое сообщение передавать в конструктор типа исключения? При генерации исключения нужно предоставлять строковое сообщение с детальной информацией о том, почему метод не смог выполнить свою задачу. Если исключение перехватывается и обрабатывается, это строковое сообщение не видно. А вот сообщения необработанных исключений обычно регистрируются в журнале. Необработанное исключение информирует о настоящем дефекте приложения, и разработчик программы должен позаботиться об искоренении дефекта. У конечного пользователя нет исходного текста и возможности исправить недостаток кода и перекомпоновать программу. Вообще говоря, это строковое сообщение конечный пользователь видеть не должен, поэтому оно может содержать массу технических деталей и предоставлять всю необходимую разработчикам информацию для устранения дефекта в коде. Кроме того, так как все разработчики должны понимать английский (ведь языки программирования и FCL-классы и методы содержат много английских слов), обычно нет нужды локализовывать строковые сообщения исключений. Впрочем, вы вправе локализовать строки, если создаете библиотеку классов для разработчиков, говорящих на других языках. В Microsoft локализуют сообщения исключений, генерируемых FCL, так как эту библиотеку классов используют разработчики, разговаривающие на самых разных языках.