- •Введение Обзор .Net. Основные понятия
- •Программа на c#
- •Основы языка Пространство имён
- •Система типов
- •Класс и Структура. Первое приближение
- •Литералы. Представление значений
- •Арифметические литералы
- •Логические литералы
- •Символьные литералы
- •Символьные escape-последовательности
- •Строковые литералы
- •Операции и выражения
- •Приоритет операций
- •Приведение типов
- •Особенности выполнения арифметических операций
- •Особенности арифметики с плавающей точкой
- •Константное выражение
- •Переменные элементарных типов. Объявление и инициализация
- •Константы
- •Перечисления
- •Объявление переменных. Область видимости и время жизни
- •Управляющие операторы
- •Синтаксис объявления метода
- •Вызов метода
- •Перегрузка методов
- •Способы передачи параметров при вызове метода
- •Передача параметров. Ссылка и ссылка на ссылку как параметры
- •Сравнение значений ссылок
- •This в нестатическом методе
- •Свойства
- •Обработка исключений
- •Массив. Объявление
- •Инициализация массивов
- •Примеры инициализации массивов
- •Два типа массивов: Value Type and Reference Type
- •Встроенный сервис по обслуживанию простых массивов
- •Реализация сортировки в массиве стандартными методами
- •Подробнее о массивах массивов (jagged array)
- •Массивы как параметры
- •Спецификатор params
- •Main в классе. Точка входа
- •Создание объекта. Конструктор
- •Операция new
- •В управляемой памяти нет ничего, что бы создавалось без конструктора
- •Кто строит конструктор умолчания
- •This в контексте конструктора
- •Перегрузка операций
- •Синтаксис объявления операторной функции
- •Унарные операции. Пример объявления и вызова
- •Бинарные операции
- •Определение операций конъюнкция и дизъюнкции
- •И вот результат…
- •Пример. Свойства и индексаторы
- •Explicit и implicit. Преобразования явные и неявные
- •Наследование
- •Наследование и проблемы доступа
- •Явное обращение к конструктору базового класса
- •Кто строит базовый элемент
- •Переопределение членов базового класса
- •Наследование и new модификатор
- •Полное квалифицированное имя. Примеры использования
- •Прекращение наследования. Sealed спецификатор
- •Абстрактные функции и абстрактные классы
- •Ссылка на объект базового класса
- •Операции is и as
- •Виртуальные функции. Принцип полиморфизма
- •Интерфейсы
- •Делегаты
- •События
- •События и делегаты. Различия
- •Атрибуты, сборки, рефлексия Рефлексия (отражение) типов
- •Реализация отражения. Type, InvokeMember, BindingFlags
- •Атрибуты
- •Сборка. Класс Assembly
- •Класс сборки в действии
- •Разбор полётов
- •Класс System.Activator
- •Версия сборки
- •Файл конфигурации приложения
- •Общедоступная сборка
- •Игры со сборками из gac
- •Динамические сборки
- •Динамическая сборка: создание, сохранение, загрузка, выполнение
- •Ввод-вывод Базовые операции
- •Потоки: байтовые, символьные, двоичные
- •Предопределённые потоки ввода-вывода
- •Функция ToString()
- •Консольный ввод-вывод. Функции-члены класса Console
- •Консольный вывод. Форматирование
- •Функции вывода. Нестандартное (custom) форматирование значений.
- •Консольный ввод. Преобразование значений
- •Файловый ввод-вывод
- •Потоки Процесс, поток, домен
- •Домен приложения
- •Обзор пространства имён System.Threading
- •Многопоточность
- •Виды многопоточности
- •А кто в домене живёт…
- •Класс Thread. Общая характеристика
- •Именование потока
- •Игры с потоками
- •Характеристики точки входа дополнительного потока
- •Запуск вторичных потоков
- •Приостановка выполнения потока
- •Отстранение потока от выполнения
- •Завершение потоков
- •Метод Join()
- •Состояния потока (перечисление ThreadState)
- •Одновременное пребывание потока в различных состояниях
- •Фоновый поток
- •Приоритет потока
- •Передача данных во вторичный поток
- •Извлечение значений (данных) с помощью Callback методов
- •Организация взаимодействия потоков
- •1. Посредством общедоступных (public) данных
- •2. Посредством общедоступных (public) свойств
- •3. Посредством общедоступных очередей
- •Состязание потоков
- •Блокировки и тупики
- •Очереди. Основа интерфейса взаимодействия
- •Безопасность данных и критические секции кода
- •Пример организации многопоточного приложения
- •Очередь как объект синхронизации
- •Синхронизация работы потоков при работе с общими ресурсами
- •1. Организация критических секций
- •2. Специальные возможности мониторов
- •Рекомендации по недопущению блокировок потоков
- •Форма Класс Form
- •Форма: управление и события жизненного цикла
- •Форма: контейнер как элемент управления
- •Разница между элементами управления и компонентами.
- •Свойства элементов управления. Anchor и Dock
- •Extender providers. Провайдеры дополнительных свойств
- •Validating и Validated элементов управления
- •Управление посредством сообщений
- •Стандартный делегат
- •Делегат EventHandler
- •Класс Application
- •События класса Application
- •Примеры перехвата сообщений
- •Метод WndProc
- •Пример переопределения WndProc
- •Контекст приложения
- •Применение классов GraphicsPath и Region. Круглая форма
- •Собственные элементы управления
- •Литература
События и делегаты. Различия
Так в чём же разница между событиями и делегатами в .NET?
В последнем примере предыдущего раздела при объявлении события очевидно его строгое соответствие определённому делегату.
public static event System.EventHandler xEvent;
System.EventHandler – это ТИП ДЕЛЕГАТА! Оператор, который обеспечивает процедуру “подписания на уведомление”, полностью соответствует оператору модификации многоадресного делегата. Аналогичным образом дело обстоит и с процедурой “отказа от уведомления”.
BaseClass.xEvent += new System.EventHandler(this.MyFun);
BaseClass.xEvent -= new System.EventHandler(xxx.MyFun);
И это действительно так. За операторными функциями += и -= скрываются методы классов-делегатов (в том числе и класса-делегата System.EventHandler).
Более того. Если в последнем примере в объявлении события ВЫКИНУТЬ ключевое слово event –
public static event System.EventHandler xEvent;
и заменить его на:
public static System.EventHandler xEvent;
System.EventHandler – это класс-делегат! То ничего не произойдёт. Вернее, ВСЁ будет происходить, как и раньше! Вместо пары СОБЫТИЕ-ДЕЛЕГАТ будет работать пара ДЕЛЕГАТ-ДЕЛЕГАТ. Таким образом, функционально событие является всего лишь разновидностью класса-делегата, главной задачей которого является обеспечение строгой привязки делегата к соответствующему событию.
Модификатор event вносит лишь незначительные синтаксические нюансы в использование этого МОДИФИЦИРОВАННОГО делегата. Чтобы хоть как-нибудь различать возбудителя и получателя события.
Атрибуты, сборки, рефлексия Рефлексия (отражение) типов
Процесс анализа типов (структуры типов) в ходе выполнения приложения (сборки). В .NET реализуется при помощи класса System.Type и пространства имён System.Reflection.
reflection - система, предоставляющая выполняемому коду информацию о нем самом.
Пространство имён System.Reflection содержит классы и интерфейсы, которые позволяют организовать просмотр загруженных в сборку типов, методов, полей (данных-членов), и обеспечивают динамические механизмы реализации типов и вызова методов. Включает множество взаимосвязанных классов, интерфейсов, структур и делегатов, предназначенных для реализации процесса отражения. Неполный перечень классов представлен ниже:
Тип |
Назначение |
Assembly |
Методы для загрузки, описания и выполнения разнообразных операций над сборкой. |
AssemblyName |
Информация о сборке (идентификатор, версия, язык реализации). |
EventInfo |
Информация о событиях. |
FieldInfo |
Информация о полях. |
MemberInfo |
Абстрактный базовый класс, определяющий общие члены для EventInfo, FieldInfo, MethodInfo, PropertyInfo. |
MethodInfo |
Информация о методе. |
Module |
Позволяет обратиться к модулю в многофайловой сборке. |
ParameterInfo |
Информация о параметре. |
PropertyInfo |
Информация о свойстве. |
Класс System.Type содержит методы, позволяющие получать информацию о типах приложения, пространства имён System.Reflection определяет типы для организации позднего связывания и динамической загрузки типов.
Класс Type является основой для реализации функциональности System.Reflection и средством для получения доступа к метаданным.
Использование членов класса Тип, позволяет получить информацию о:
типе (GetType(string)),
конструкторах (GetConstructors()),
методах (GetMethods()),
данных-членах (GetFields()),
свойствах (GetProperties()),
событиях, объявленных в классе (GetEvents()),
модуле,
сборке, в которой реализуется данный класс.
Объект-представитель класса Type уникален. Две ссылки на объекты-представители класса Type оказываются эквивалентными, если только они были построены в результате обращения к одному и тому же типу.
Объект-представитель класса Type может представить любой из следующих типов:
Классы
Размерные типы
Массивы
Интерфейсы
Указатели
Перечисления
Ссылка на объект-представитель класса Type, ассоциированная с некоторым типом, может быть получена одним из следующих способов:
1. В результате вызова метода
Type Object.GetType()
(метода-члена класса Object), который возвращает ссылку на объект-представитель типа Type, представляющий информацию о типе. Вызов производится от имени объекта-представителя данного типа. Вызов становится возможен в связи с тем, что любой класс наследует тип Object.
2. В результате вызова статического метода-члена класса Type:
public static Type Type.GetType(string)
Параметром является строка со значением имени типа. Возвращает объект-представитель класса Type, с информацией о типе, специфицированном параметром метода.
3. От имени объекта-представителя класса Assembly - от имени объекта-сборки (самоописываемого, многократно используемого, версифицируемого БЛОКА (фрагмента) CLR-приложения) вызываются методы
Type[] Assembly.GetTypes()
Type Assembly.GetType(string)
// Получаем ссылку на сборку, содержащую объявление типа MyType,
// затем – массив объектов-представителей класса Type.
Type[] tt = (Assembly.GetAssembly(typeof(MyType))).GetTypes();
// Без комментариев.
Type[] tt = (Assembly.GetAssembly(typeof(MyType))).GetType(“MyType”);
От имени объекта-представителя класса Module (Модуль - portable executable файл с расширением .dll или .exe, состоящий из одного и более классов и интерфейсов)
Type[] Module.GetTypes()
Type Module.GetType(string)
Type[] Module.FindTypes(TypeFilter filter, object filterCriteria)
где TypeFilter – класс-делегат
// The TypeFilter делегаты используются to filter списка классов.
// А как этим хозяйством пользоваться - не знаю. В хелпах не нашёл.
public delegate bool TypeFilter(Type m, object filterCriteria);
4. В результате выполнения операции typeof(), которая применяется для построения объекта-представителя класса System.Type. Выражение, построенное на основе операции typeof, имеет следующий вид:
typeof(type)
Операнд выражения – тип, для которого может быть построен объект-представитель класса System.Type.
Пример применения операции:
using System;
using System.Reflection;
public class MyClass
{
public int intI;
public void MyMeth()
{
}
public static void Main()
{
Type t = typeof(MyClass);
// Альтернативная эквивалентная конструкция
// MyClass t1 = new MyClass();
// Type t = t1.GetType();
MethodInfo[] x = t.GetMethods();
foreach (MethodInfo m in x)
{
Console.WriteLine(m.ToString());
}
Console.WriteLine();
MemberInfo[] x2 = t.GetMembers();
foreach (MemberInfo m in x2)
{
Console.WriteLine(m.ToString());
}
}
}