- •Введение Обзор .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. Круглая форма
- •Собственные элементы управления
- •Литература
Инициализация массивов
Массив мало объявить, его нужно ещё проинициализировать. Только тогда ранее специфицированное множество однотипных объектов будет размещено в памяти.
Определение предполагает спецификацию КОЛИЧЕСТВА объектов по каждому измерению.
ИнициализацияМассива ::= = newИнициализация
::= = ИнициализацияСписком
::= = ЗаполняющаяИнициализация
::= = ИнициализацияКопированием
newИнициализация ::= new ИмяТипа СписокОписателейРазмерности
ЗаполняющаяИнициализация ::= newИнициализация ИнициализацияСписком
СписокОписателейРазмерности ::= [СписокОписателейРазмерности] ОписательРазмерности
ОписательРазмерности ::= [СписокОписателей] | ПустойОписатель
СписокОписателей ::= [СписокОписателей ,] Описатель
Описатель ::= Выражение
ПустойОписатель ::= [ПУСТО]
Выражение-описатель должно быть:
целочисленным,
с определённым значением.
Такой фокус при определении и инициализации массивов не проходит:
int x; // К моменту определения массива значение x должно быть определено!
int[] arr0 = new int[x];
Так нормально! В момент определения массива CLR знает ВСЕ НЕОБХОДИМЫЕ характеристики определяемого массива.
int x = 10;
int[][] arr1 = new int[125][x];
Естественно, общее количество описателей размерности должно соответствовать количеству неявных спецификаторов.
ВСЕ НЕОБХОДИМЫЕ характеристики – это не всегда ВСЕ!
При определении массивов произвольной размерности инициализирующая запись должна содержать ПОЛНУЮ информацию о характеристиках первой составляющей массива. Все остальные описатели могут оставаться пустыми.
int val1 = 100;
// На этом этапе определения массива массивов
// элементов типа int принципиально знание характеристик первой составляющей!
// Все остальные могут быть заданы после!
int [][] x0 = new int[15][];
int [][][] x1 = new int[val1][][];
int [,][] x2 = new int[val1,7][];
int [,,][,][] x3 = new int[2,val1,7][,][];
// Следующие способы объявления корректными не являются.
// int [][][] y0 = new int[val1][2][];
// int [][][] y1 = new int[][2][7];
// int [,][] y2 = new int[ ,2][7];
// int [,,] y3 = new int[val1,2, ];
При такой форме определения массива предполагается многоступенчатая инициализация, при которой производится последовательная инициализация составляющих массива.
ИнициализацияСписком ::= {СписокВыражений}
::= {СписокИнициализаторовСоставляющихМассива}
СписокИнициализаторовСоставляющихМассива ::=
[СписокИнициализаторовСоставляющихМассива , ] ИнициализаторМассива
ИнициализаторМассива ::= newИнициализация {СписокВыражений} | {СписокВыражений}
СписокВыражений ::= [СписокВыражений ,] Выражение
При инициализации списком каждый элемент массива (или составляющая массива) получает собственное значение из списка.
int[] r = {val1, 1, 4, 1*val1};
Избыточная инициализация с дополнительной возможностью уточнения характеристик массива.
int[] r = new int[] {val1, 1, 4, 1*val1};
int[] t = new int[4] {val1, 1, 4, 1*val1};
В первом случае избыточная инициализация – рецидив многословия. Тип значений элементов массива определяется спецификатором массива, количество элементов массива определяется количеством элементов списка выражений.
Во втором случае избыточная инициализация – способ дополнительного контроля размеров массива. Транслятор сосчитает количество элементов списка и сопоставит его со значением описателя.
Инициализация многомерных массивов – дело ответственное, которое требует особого внимания и не всегда может быть компактно наглядно представлено одним оператором.
При этом само объявление оператора может содержать лишь частичную инициализацию, а может и не содержать её вовсе. Делу инициализации одного массива может быть посвящено множество операторов. В этом случае инициализирующие операторы строятся на основе операций присвоения. Главное при этом – не выходить за пределы характеристик массива, заданных при объявлении массива.
ИнициализацияКопированием ::= СпецификацияСоставляющей
СпецификацияСоставляющей ::= ИмяМассива СписокИндексныхВыражений
СписокИндексныхВыражений ::= [СписокИндексныхВыражений] [ИндексноеВыражение]
ИндексноеВыражение ::= Выражение
В силу того, что массив является объектом ссылочного типа, составляющие одного массива могут быть использованы для инициализации другого массива. Ответственность за возможные переплетения ссылок возлагается на программиста.
int [] q = {0,1,2,3,4,5,6,7,8,9};
int [][] d1 = {
new int[3],
new int[5]
};
int [][][] d2 = new int[2][][];
d2[0] = new int[50][]; d2[0][0] = d1[0];
// d2[1][0] ссылается на составляющую массива d1.
d2[0][1] = new int[125];
d2[1] = new int[50][];
d2[1][1] = new int[10]{1,2,3,4,5,6,7,8,9,10};
d2[1][0] = q;
// d2[1][0] ссылается на ранее объявленный и определённый массив q.