- •Введение Обзор .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. Круглая форма
- •Собственные элементы управления
- •Литература
Разница между элементами управления и компонентами.
Элемент управления имеет видимое представление и непосредственно используется в процессе управления формой. Компоненты (таймер, провайдеры дополнительных свойств) видимого представления не имеют. И поэтому в управлении формой участвуют опосредованно.
Свойства элементов управления. Anchor и Dock
Средства, которые обеспечивают стыковку и фиксацию элементов управления в условиях изменяемых размеров контейнера.
Anchor позволяет автоматически выдерживать постоянное расстояние между границами элемента управления, для которого оно определено, и границами контейнера. И это обеспечивается за счёт автоматического изменения размеров “зацепленного” элемента управления вслед за изменениями размеров контейнера. Таким образом обеспечивается реакция элемента управления на изменения контейнера.
Dock – стыковка. Прикрепление элемента управления к границе контейнера. Dock – свойство элемента управления, а не контейнера. Центральный прямоугольник приводит к тому, что элемент управления заполнит всю поверхность контейнера.
Extender providers. Провайдеры дополнительных свойств
An extender provider - компонент, который предоставляет свойства другим компонентам. Это делается с целью расширения множества свойств (элементов управления).
ToolTipProvider,
HelpProvider,
ErrorProvider.
Например, когда a ToolTip Component (Windows Forms) компонент добавляется к форме, все остальные компоненты, размещённые на этой форме, получают новое свойство, которое даже можно просматривать и устанавливать (редактировать) в окне Properties непосредственно в процессе разработки формы. И это новое свойство, называемое ToolTip, вызывается для каждого элемента управления данной формы.
Не надо обольщаться. Множество свойств элементов управления не изменилось. Дополнительное свойство предоставляется ВСЕМ элементам отдельным компонентом.
На этапе разработки, это свойство появляется в Properties window for the component that is being modified.
Однако при выполнении (at run time), это свойство не может быть доступно (accessed) непосредственно через данный конкретный элемент управления.
В следующем примере кода форма была построена с кнопочкой, которая была названа MyButton и элементол управления ToolTip, названным MyToolTip, which provides a ToolTip property.
// И вот так просто и наивно значение свойства кнопочки не получить,
// поскольку это свойство не родное!
// This is an example of code that is NOT CORRECT!
string myString;
myString = MyButton.ToolTip;
Подобное обращение пиведёт к ошибке ещё на стадии компиляции. А вот как надо обращаться к этому самому дополнительному свойству, установленному для кнопочки (просто форменное надувательство):
string myString;
myString = MyToolTip.GetToolTip(MyButton);
Провайдеры дополнительных свойств являются классами, а это означает, что у них имеются собственные свойства и методы.
Пример…
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Rolls01
{
/// <summary>
/// Summary description for numPointsForm.
/// </summary>
public class numPointsForm : System.Windows.Forms.Form
{
Form1 f1;
int nPoints;
private System.Windows.Forms.TextBox numBox;
private System.Windows.Forms.Button button1;
private System.ComponentModel.IContainer components;
private System.Windows.Forms.ToolTip toolTip;
// Ссылка на объект-представитель класса ErrorProvider
private System.Windows.Forms.ErrorProvider errorProvider;
private string[] errMess;
public numPointsForm(Form1 f1Key)
{
f1 = f1Key;
InitializeComponent();
errMess = new string[] {
"Больше двух тараканов!",
"Целое и больше двух!"
};
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.numBox = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
this.SuspendLayout();
//
// numBox
//
this.numBox.Location = new System.Drawing.Point(8, 11);
this.numBox.Name = "numBox";
this.numBox.Size = new System.Drawing.Size(184, 20);
this.numBox.TabIndex = 0;
this.numBox.Text = "";
this.numBox.Validating +=
new System.ComponentModel.CancelEventHandler(this.numBox_Validating);
//
// button1
//
this.button1.Location = new System.Drawing.Point(208, 8);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "OK";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// numPointsForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(288, 45);
this.Controls.Add(this.button1);
this.Controls.Add(this.numBox);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "numPointsForm";
this.Text = "numPointsForm";
this.Load += new System.EventHandler(this.numPointsForm_Load);
this.ResumeLayout(false);
}
#endregion
private void numBox_Validating
(object sender, System.ComponentModel.CancelEventArgs e)
{
int x;
try
{
x = int.Parse(numBox.Text);
if (x <= 1)
{
numBox.Text = nPoints.ToString();
e.Cancel = true;
errorProvider.SetError(numBox, this.errMess[0]);
}
else
{
nPoints = x;
}
}
catch (Exception e2)
{
numBox.Text = nPoints.ToString();
e.Cancel = true;
// Обращение к Error провайдеру.
errorProvider.SetError(numBox, this.errMess[1]);
}
}
private void numPointsForm_Load(object sender, System.EventArgs e)
{
nPoints = f1.nPoints;
numBox.Text = nPoints.ToString();
toolTip.SetToolTip(numBox,"Количество тараканчиков. Больше двух.");
errorProvider = new ErrorProvider();
}
private void button1_Click(object sender, System.EventArgs e)
{
f1.nPoints = nPoints;
this.Close();
}
}
}