- •Сборки (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. Создание и использование итераторов.
- •Общие сведения о итераторах
Исключения в платформе .Net Framework
Исключение — это любое ошибочное условие или непредвиденное поведение, с которым сталкивается программа в процессе выполнения. Исключения могут возникать вследствие сбоя в вашем коде или в вызванном коде (таком как общая библиотека), недоступности ресурсов операционной системы, неожиданных условий, с которыми сталкивается общеязыковая среда выполнения (такими как код, который не может быть проверен), и т. д. При возникновении некоторых из этих условий приложение пользователя может выполнить восстановление самостоятельно, однако это возможно не всегда. Восстановление возможно для большинства случаев исключений приложений, но оно невозможно для подавляющей части исключений среды выполнения.
В платформе .NET Framework исключение — это объект, наследуемый от класса System.Exception. Исключение посылается из области кода, где возникла проблема. Исключение передается в стек до тех пор, пока его не обработает приложение или не завершится выполнение программы.
Исключения и традиционные методы обработки ошибок
Традиционно модели обработки ошибок разных языков программирования основываются либо на уникальном для языка способе обнаружения ошибок и отыскании для них обработчиков, либо на механизме обработки ошибок, предоставляемом операционной системой. Среда выполнения реализует обработку исключений с использованием следующих возможностей:
Обработка исключений без учета языка, на котором сгенерировано или обрабатывается данное исключение.
Отсутствие необходимости в использовании определенного синтаксиса для обработки исключений — для каждого языка может применяться свой собственный синтаксис.
Возможность порождения исключений между процессам и даже между компьютерами.
Исключения предоставляют ряд преимуществ по сравнению с другими методами уведомлений об ошибках, такими как коды возврата. Сбои не проходят незамеченными. Недопустимые значения не продолжают распространяться в системе. Нет необходимости в проверке кодов возврата. Код обработки исключений можно очень легко добавить для увеличения надежности программы. Наконец, обработка исключений производится средой выполнения быстрее, чем обработка ошибок C++ на базе Windows.
Поскольку потоки исключений очень просто проходят по блокам как управляемых, так и неуправляемых кодов, среда выполнения может создавать и перехватывать исключения и в управляемом, и в неуправляемом коде. Неуправляемый код может включать и исключения SEH в стиле С++, и HRESULTS из COM.
Управление исключениями средой выполнения
Среда выполнения использует модель обработки исключений, основанную на объектах исключения и защищенных блоках кода. Объект Exceptionсоздается для представления исключения при его возникновении.
Для каждого выполняемого кода среда выполнения создает таблицу сведений об исключениях. Для каждого метода выполнения имеется связанный с ним массив информации по обработке исключений (который может быть и пустым) в таблице сведений об исключениях. Каждая запись массива описывает защищенный блок кода, все фильтры исключений, связанные с этим кодом, и все обработчики исключений (операторы catch).Применение этой таблицы исключений весьма результативно, так как при отсутствии исключения не происходит снижения производительности процессора или неэффективного использования памяти. Ресурсы используются только при возникновении исключения.
Таблица сведений об исключении отображает четыре типа обработчиков исключений для защищенных блоков.
Обработчик finally выполняется всегда, когда происходит выход из блока, вне зависимости от того, возникло ли исключение при нормальном потоке управления или это необработанное исключение.
Обработчик сбоев, который должен выполняться при возникновении исключения, но не выполняется по завершении нормального потока управления.
Обработчик с фильтрацией по типу обрабатывает любое исключение заданного класса или любого из производных этого класса.
Обработчик с пользовательской фильтрацией запускает заданный пользователем код, чтобы определить, должно ли данное исключение обрабатываться связанным обработчиком или его следует передать в следующий защищенный блок.
Каждый язык реализует такие обработчики исключений в соответствии с его спецификациями. Например, Visual Basic предоставляет доступ к обработчику с пользовательской фильтрацией посредством сравнения переменных (с использованием ключевого слова When) в операторе catch; C# не реализует обработчик с пользовательской фильтрацией.
При возникновении исключения среда выполнения начинает выполнение процесса, состоящего из двух шагов:
Среда выполнения производит поиск массива для первого защищенного блока, в котором:
защищена область, включающая выполняемую в данный момент инструкцию;
содержится обработчик исключения или фильтр для обработки этого исключения.
Если массив найден, среда выполнения создает объект Exception, описывающий данное исключение. Затем среда выполнения выполняет все операторы finally или сбойные операторы, находящиеся между оператором, в котором возникло исключение, и оператором обработки этого исключения. Обратите внимание, что важен порядок обработчиков исключений — первым определяется внутренний обработчик. Обратите внимание, что обработчики исключений могут получать доступ к локальным переменным и локальной памяти программы, перехватывающей исключение, но любые промежуточные значения на момент инициации исключения теряются.
Если в текущем методе согласований не найдено, среда выполнения проводит поиск каждого вызывающего оператора текущего метода и продолжает этот процесс, перемещаясь вверх по стеку. Если не найден ни один соответствующий оператор, то среда выполнения предоставляет отладчику доступ к исключению. Если отладчик не подключается к исключению, то среда выполнения создает событие AppDomain.UnhandledException. Если нет слушателей для этого события, то среда выполнения делает дамп трассировки стека и завершает приложение.