- •Введение Обзор .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
::= static
::= virtual
::= sealed
::= override
::= abstract
::= extern
СпецификаторДоступности ::= public
::= private
::= protected
::= internal
::= protected internal
ТипВозвращаемогоЗначения ::= void | ИмяТипа
ТелоМетода ::= БлокОператоров
::= ;
Имя ::= Идентификатор
СписокПараметров ::= [СписокПараметров ,] ОбъявлениеПараметра
ОбъявлениеПараметра ::= [СпецификаторПередачи] ИмяТипа ИмяПараметра
::= [СпецификаторСписка] ИмяТипаСписка ИмяПараметра
СпецификаторПараметра ::= СпецификаторПередачи | СпецификаторСписка
СпецификаторПередачи ::= ref | out
СпецификаторСписка ::= params
ИмяТипаСписка ::= ИмяТипа[]
Тело метода может быть пустым! В этом случае за заголовком метода располагается точка с запятой.
Вызов метода
ВыражениеВызоваМетода ::= ИмяМетода([СписокПараметровВызова])
::= *****
СписокПараметровВызова ::= [СписокПараметровВызова ,] ПараметрВызова
ПараметрВызова ::= [СпецификаторПередачи] Выражение
Перегрузка методов
Имя и список типов параметров являются важной характеристикой метода и называются СИГНАТУРОЙ метода. В C# методы, объявляемые в классе, идентифицируются по сигнатуре метода.
Эта особенность языка позволяет объявлять в классе множество одноименных методов. Такие методы называются перегруженными, а деятельность по объявлению таких методов – перегрузкой.
При написании программного кода, содержащего ВЫРАЖЕНИЯ ВЫЗОВА переопределённых методов корректное соотнесение выражения вызова метода определяет метод, которому будет передано управление.
// Класс содержит объявление четырёх одноименных методов
// с различными списками параметров.
class C1
{
void Fx(float key1)
{
return;
}
int Fx(int key1)
{
return key1;
}
int Fx(int key1, int key2)
{
return key1;
}
int Fx(byte key1, int key2)
{
return (int)key1;
}
static void Main(string[] args)
{
C1 c = new C1();
// Нестатические методы вызываются от имени объекта c.
// Передача управления соответствующему методу
// обеспечивается явными преобразованиями к типу.
c.Fx(Convert.ToSingle(1));
c.Fx(3.14F);
c.Fx(1);
c.Fx(1,2);
c.Fx((byte)10, 125);
}
}
Информация о типе возвращаемого значения при этом не учитывается, поскольку в выражении вызова возвращаемое значение метода может не использоваться вовсе.
Способы передачи параметров при вызове метода
Известно два способа передачи параметров при вызове метода:
по значению (в силу специфики механизма передачи параметров только входные),
по ссылке (входные и/или выходные).
По значению – БЕЗ спецификаторов (для размерных типов этот способ предполагается по умолчанию). Локальная копия значения в методе. Параметр представляет собой означенную переменную. Его можно использовать в методе наряду с переменными, объявленными в теле метода. Изменение значения параметра НЕ влияет на значение параметра в выражении вызова.
Для организации передачи по ссылке параметра РАЗМЕРНОГО типа требуется явная спецификация ref или out. По ссылке – спецификатор ref (для ссылочных типов предполагается по умолчанию (другого способа передачи параметра для ссылочных типов просто нет), для размерных типов спецификатор необходимо явно указывать).
Параметр по ссылке и параметр по значению – большая разница! Это основание для перегрузки метода!
using System;
class XXX {
public int mmm;
}
class Class1
{//=============================================
static int i;
static void f1 (ref int x)
{
x = 125;
}
static void f1 (int x)
{
x = 0;
}
static void f1 (XXX par)
{
par.mmm = 125;
}
static void f1 (out XXX par)
{
par = new XXX(); // Ссылка на out XXX par ДОЛЖНА быть
// проинициализирована в теле
// метода НЕПОСРЕДСТВЕННО перед обращением к ней!
// Способ инициализации – любой! В том числе и созданием объекта!
// А можно и присвоением в качестве значения какой-либо другой ссылки.
par.mmm = 125;
}
// Для размерного типа параметра метода со списками параметров, которые
// различаются только спецификаторами out - ref
// несовместимы. out – частный случай ссылки.
//static void f1 (out int x)
//{
// x = 125;
//}
static void Main(string[] args)
{//======================================
int a = 0;
f1(ref a);
//f1(out a);
f1(a);
XXX xxx = new XXX();
xxx.mmm = 0;
f1(xxx);
f1(ref xxx);
// По возвращении из метода это уже другая ссылка!
// Под именем xxx – другой объект.
}//======================================
}//=============================================