- •Введение Обзор .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. Круглая форма
- •Собственные элементы управления
- •Литература
Main в классе. Точка входа
Без статической функции (метода) Main невозможно построить выполняемую программу. Без явно обозначенной точки входа сборка не можен выполняться.
В сборке можно располагать несколько классов. Каждый класс располагает собственным набором методов. В каждом классе могут располагаться одноименные методы. В следующем примере объявляются три класса в одном пространстве имён. В каждом классе объявляется независимая точка входа. Три (!) СТАТИЧЕСКИЕ функции Main. Возможно и такое. При этом главная проблема - при компиляции надо явным образом указать точку входа.
Это можно сделать из командной строки при вызове компилятора. Например, так:
c:\ csc /main:Class1.Class3 Example1.cs
Можно через диалог The Startup Object property среды разработки приложений (меню Проект-Свойства проекта, далее - General, Common Properties, <Projectname> Property Pages Dialog Box (Visual C#)), который обеспечивает спецификацию значений, которые явным образом НЕ ПРОПИСАНЫ в проекте. В разделе Startup object, надо раскрыть список классов и указать соответствующий класс.
Транслятор соберёт сборку, В которой будет обеспечена передача управления соответствующей функции Main (одной из трёх!).
using System;
namespace Example1
{
//===============================================
public class Class1
{
// Спецификатор public нужен здесь. Третий класс.
public class Class3
{
public static void Main()
{
string[] sss = new string[]{Class1.s.ToString(),”12345”};
Class1.Main(sss);
}
}
int d = 0;
public static int s;
static void Main(string[] args)
{
Class1 c1 = new Class1();
f1(c1);
c1.f2();
Class2 c2 = new Class2();
//c2.f2();
c2.f3();
string[] sss = new string[] {”qwerty”, c1.ToString()};
Class2.Main(sss);
}
static void f1(Class1 x)
{
//x.s = 100;
s = 0;
Class1.s = 125;
x.d = 1;
//d = 100;
}
void f2()
{
s = 0;
Class1.s = 100;
//this.s = 5;
//Class1.d = 125;
this.d = 100;
d = 100;
}
}
//===============================================
class Class2
{
int d;
static int s;
public static void Main(string[] args)
{
Class1.Class3.Main();
Class2 c2 = new Class2();
f1(c2);
c2.f2();
//Class1.Main();
}
static void f1(Class2 x)
{
//x.s = 100;
s = 0;
Class2.s = 125;
x.d = 1;
//d = 100;
}
void f2()
{
s = 0;
Class1.s = 100;
//this.s = 5;
//Class1.d = 125;
this.d = 100;
d = 100;
}
public void f3()
{
s = 0;
Class1.s = 100;
//this.s = 5;
//Class1.d = 125;
this.d = 100;
d = 100;
}
}
//===============================================
}
Структура также может иметь свою точку входа!
using System;
namespace defConstructors
{
struct MyStruct
{
static void Main(string[] args)
{
Console.WriteLine(“Ha-ha-ha”);
}
}
}
Создание объекта. Конструктор
Конструктором называется группировка кода, которой передаётся управление при создании объекта. Синтаксис объявления конструктора аналогичен обявлению метода. Те же спецификаторы доступа, имя, список параметров. Особенности конструктора заключаются в том, что:
конструктор НЕ ИМЕЕТ НИКАКОГО спецификатора возвращаемого даже void,
имя конструктора полностью совпадает с именем класса или структуры,
в классе и в структуре можно объявлять множество вариантов конструкторов. Они должны отличаться списками параметров. В структуре невозможно объявить конструктор с пустым списком параметров,
не существует выражения вызова для конструктора, управление в конструктор передаётся посредством выполнения специальной операции new.
В C# ключевое слово new может быть использовано как ОПЕРАЦИЯ или как МОДИФИКАТОР.
new как операция используется:
для ссылочных типов (типов-ссылок) при создании объектов в уравляемой памяти и передачи управления конструкторам,
для размерных типов (типов-значений) при создании объектов в СТЕКЕ. Возможно, что при этом может потребоваться обращение к конструктору.
new как модификатор используется для сокрытия наследуемых из базового класса данных и методов. Об этом позже. После того, как рассмотрим подробнее принцип наследования.