- •Введение Обзор .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 модификатор
Этот модификатор используется при объявлении класса-наследника в том случае, если надо явным образом скрыть факт наследования объявляемого члена класса.
public class MyBaseC
{
public int x;
public void Invoke();
}
Объявление члена класса Invoke в наследуемом классе скрывает метод Invoke в базовом классе:
public class MyDerivedC : MyBaseC
{
new public void Invoke();
}
А вот данное-член x не было скрыто в производном классе соответствующим членом, следовательно, остаётся доступным в производном классе.
Сокрытие имени члена базового класса в производном классе возможно в одной из следующих форм:
Константа, поле, свойство, или внедрённый в класс тип или структура скрывают ВСЕ одноименные члены базового класса.
Внедрённый в класс или структуру метод скрывает в базовом классе свойства, поля, типы, обозначенные тем же самым идентификатором. Также в базовом классе скрываются одноимённые методы с той же самой сигнатурой.
Объявляемые в производном классе индексаторы, скрывают одноименные индексаторы в базовом классе с аналогичной сигнатурой.
В производном классе одновременное использование члена базового класса и его переопределённого потомка является ошибкой.
Полное квалифицированное имя. Примеры использования
В этом примере базовый и BC и производный DC классы используют одно и то же имя для обозначения объявляемого в обоих классах члена типа int. new модификатор подчеркивает факт недоступности члена x базового класса в производном классе. Однако из производного класса всё-таки можно обратиться к переопределённому полю базового класса с использованием полного квалифицированного имени.
using System;
public class BC
{
public static int x = 55;
public static int y = 22;
}
public class DC : BC
{
new public static int x = 100; // Переопределили члена базового класса
public static void Main()
{
// Доступ к переопределённому члену x:
Console.WriteLine(x);
// Доступ к члену базового класса x:
Console.WriteLine(BC.x);
// Доступ к члену y:
Console.WriteLine(y);
}
}
В производном классе DC переопределяется вложенный класс C. В рамках производного класса легко можно создать объект-представитель вложенного переопределённого класса C. Для создания аналогичного объекта-представителя базового класса, необходимо использовать полное квалифицированное имя.
using System;
public class BC
{
public class C
{
public int x = 200;
public int y;
}
}
public class DC:BC
{
new public class C // Вложенный класс базового класса скрывается
{
public int x = 100;
public int y;
public int z;
}
public static void Main()
{
// Из производного класса виден переопределённый вложенный класс:
C s1 = new C();
// Полное имя используется для доступа к вложенному в базовый класс:
BC.C s2 = new BC.C();
Console.WriteLine(s1.x);
Console.WriteLine(s2.x);
}
}
Прекращение наследования. Sealed спецификатор
Принцип наследования допускает неограниченную глубину иерархии наследования. Производный класс, являющийся наследником базового класса, может в свою очередь сам оказаться в роли базового класса. Однако не всегда продолжение цепочки предок-потомок может оказаться целесообразным.
Если при разработке класса возникла ситуация, при котором дальнейшее совершенствование и переопределение возможностей класса в деле решения специфических задач окажется нецелесообразным (сколько можно заниматься переопределением функций форматирования), класс может быть закрыт для дальнейшего наследования. Закрытие класса обеспечивается спецификатором sealed. При этом закрываться для наследования может как класс целиком, так и отдельные его члены.
sealed class X
{
}
class Y:X // Наследование от класса X невозможно
{
}
А так закрывается для переопределения функция-член класса:
class X
{
sealed public void f0()
{
}
}
class Y:X
{
public void f0(){} // Наследование (переопределение) f0, объявленной в X запрещено!
}