- •1. Лекция: Visual Studio .Net, Framework .Net
- •Visual Studio .Net - открытая среда разработки
- •Открытость
- •Framework .Net - единый каркас среды разработки
- •Библиотека классов FCL - статический компонент каркаса
- •Единство каркаса
- •Встроенные примитивные типы
- •Структурные типы
- •Архитектура приложений
- •Модульность
- •Общеязыковая исполнительная среда CLR - динамический компонент каркаса
- •Двухэтапная компиляция. Управляемый модуль и управляемый код
- •Виртуальная машина
- •Дизассемблер и ассемблер
- •Метаданные
- •Сборщик мусора - Garbage Collector - и управление памятью
- •Исключительные ситуации
- •События
- •Общие спецификации и совместимые модули
- •2. Лекция: Язык C# и первые проекты
- •Создание C#
- •Виды проектов
- •Консольный проект
- •Windows-проект
- •Начало начал - точка "большого взрыва"
- •Выполнение проекта по умолчанию после "большого взрыва"
- •Проект WindowsHello
- •3. Лекция: Система типов языка С#
- •Общий взгляд
- •Система типов
- •Типы или классы? И типы, и классы
- •Семантика присваивания
- •Преобразование к типу object
- •Примеры преобразований
- •Семантика присваивания. Преобразования между ссылочными и значимыми типами
- •Операции "упаковать" и "распаковать" (boxing и unboxing).
- •4. Лекция: Преобразования типов
- •Где, как и когда выполняются преобразования типов?
- •Преобразования ссылочных типов
- •Преобразования типов в выражениях
- •Преобразования внутри арифметического типа
- •Явные преобразования
- •Преобразования строкового типа
- •Преобразования и класс Convert
- •Проверяемые преобразования
- •Исключения и охраняемые блоки. Первое знакомство
- •Опасные вычисления в охраняемых проверяемых блоках
- •Опасные вычисления в охраняемых непроверяемых блоках
- •Опасные преобразования и методы класса Convert
- •5. Лекция: Переменные и выражения
- •Объявление переменных
- •Проект Variables
- •Синтаксис объявления
- •Время жизни и область видимости переменных
- •Поля
- •Локальные переменные
- •Глобальные переменные уровня процедуры. Существуют ли?
- •Константы
- •6. Лекция: Выражения. Операции в выражениях
- •Выражения
- •Приоритет и порядок выполнения операций
- •Перегрузка операций
- •С чего начинается выполнение выражения
- •Операции "увеличить" и "уменьшить" (increment, decrement)
- •Операции sizeof и typeof
- •Как получить подробную информацию о классе?
- •Статические поля и методы арифметических классов
- •Операция new
- •Арифметические операции
- •Операции отношения
- •Операции проверки типов
- •Операции сдвига
- •Логические операции
- •Условное выражение
- •Операция приведения к типу
- •7. Лекция: Присваивание и встроенные функции
- •Присваивание
- •Специальные случаи присваивания
- •Определенное присваивание
- •Еще раз о семантике присваивания
- •Рассмотрим объявления:
- •Класс Math и его функции
- •Класс Random и его функции
- •8. Лекция: Операторы языка C#
- •Операторы языка C#
- •Оператор присваивания
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора
- •Оператор if
- •Оператор switch
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Операторы цикла
- •Оператор for
- •Циклы While
- •Цикл foreach
- •9. Лекция: Процедуры и функции - методы класса
- •Процедуры и функции - функциональные модули
- •Процедуры и функции - методы класса
- •Процедуры и функции. Отличия
- •Описание методов (процедур и функций). Синтаксис
- •Список формальных аргументов
- •Тело метода
- •Вызов метода. Синтаксис
- •О соответствии списков формальных и фактических аргументов
- •Вызов метода. Семантика
- •Что нужно знать о методах?
- •Почему у методов мало аргументов?
- •Поля класса или функции без аргументов?
- •Пример: две версии класса Account
- •Функции с побочным эффектом
- •Методы. Перегрузка
- •10. Лекция: Корректность методов. Рекурсия
- •Корректность методов
- •Инварианты и варианты цикла
- •Рекурсия
- •Рекурсивное решение задачи "Ханойские башни"
- •Быстрая сортировка Хоара
- •11. Лекция: Массивы языка C#
- •Общий взгляд
- •Объявление массивов
- •Объявление одномерных массивов
- •Динамические массивы
- •Многомерные массивы
- •Массивы массивов
- •Процедуры и массивы
- •12. Лекция: Класс Array и новые возможности массивов
- •Класс Array
- •Массивы как коллекции
- •Сортировка и поиск. Статические методы класса Array
- •Класс Object и массивы
- •Массивы объектов
- •Массивы. Семантика присваивания
- •13. Лекция: Символы и строки постоянной длины в C#
- •Общий взгляд
- •Строки С++
- •Строки С#
- •Класс char
- •Класс char[] - массив символов
- •Существует ли в C# тип char*
- •14. Лекция: Строки C#. Классы String и StringBuilder
- •Класс String
- •Объявление строк. Конструкторы класса string
- •Операции над строками
- •Строковые константы
- •Неизменяемый класс string
- •Статические свойства и методы класса String
- •Метод Format
- •Методы Join и Split
- •Динамические методы класса String
- •Класс StringBuilder - построитель строк
- •Объявление строк. Конструкторы класса StringBuilder
- •Операции над строками
- •Основные методы
- •Емкость буфера
- •15. Лекция: Регулярные выражения
- •Пространство имен RegularExpression и классы регулярных выражений
- •Немного теории
- •Синтаксис регулярных выражений
- •Классы Group и GroupCollection
- •Классы Capture и CaptureCollection
- •Перечисление RegexOptions
- •Класс RegexCompilationInfo
- •Примеры работы с регулярными выражениями
- •Пример "чет и нечет"
- •Пример "око и рококо"
- •Пример "кок и кук"
- •Пример "обратные ссылки"
- •Пример "Дом Джека"
- •Пример "Атрибуты"
- •16. Лекция: Классы
- •Классы и ООП
- •Две роли классов
- •Синтаксис класса
- •Поля класса
- •Доступ к полям
- •Методы класса
- •Доступ к методам
- •Методы-свойства
- •Индексаторы
- •Операции
- •Статические поля и методы класса
- •Константы
- •Конструкторы класса
- •Деструкторы класса
- •Проектирование класса Rational
- •Свойства класса Rational
- •Конструкторы класса Rational
- •Методы класса Rational
- •Закрытый метод НОД
- •Печать рациональных чисел
- •Тестирование создания рациональных чисел
- •Операции над рациональными числами
- •Константы класса Rational
- •17. Лекция: Структуры и перечисления
- •Развернутые и ссылочные типы
- •Классы и структуры
- •Структуры
- •Синтаксис структур
- •Класс Rational или структура Rational
- •Встроенные структуры
- •Еще раз о двух семантиках присваивания
- •Перечисления
- •Персоны и профессии
- •18. Лекция: Отношения между классами. Клиенты и наследники
- •Отношения между классами
- •Отношения "является" и "имеет"
- •Отношение вложенности
- •Расширение определения клиента класса
- •Отношения между клиентами и поставщиками
- •Сам себе клиент
- •Наследование
- •Добавление полей потомком
- •Конструкторы родителей и потомков
- •Добавление методов и изменение методов родителя
- •Статический контроль типов и динамическое связывание
- •Три механизма, обеспечивающие полиморфизм
- •Пример работы с полиморфным семейством классов
- •Абстрактные классы
- •Классы без потомков
- •19. Лекция: Интерфейсы. Множественное наследование
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
- •Проблемы множественного наследования
- •Коллизия имен
- •Наследование от общего предка
- •Встроенные интерфейсы
- •Упорядоченность объектов и интерфейс IComparable
- •Клонирование и интерфейс ICloneable
- •Сериализация объектов
- •Класс с атрибутом сериализации
- •Интерфейс ISerializable
- •20. Лекция: Функциональный тип в C#. Делегаты
- •Как определяется функциональный тип и как появляются его экземпляры
- •Функции высших порядков
- •Вычисление интеграла
- •Построение программных систем методом "раскрутки". Функции обратного вызова
- •Наследование и полиморфизм - альтернатива обратному вызову
- •Делегаты как свойства
- •Операции над делегатами. Класс Delegate
- •Операции "+" и "-"
- •Пример "Комбинирование делегатов"
- •Пример "Плохая служба"
- •21. Лекция: События
- •Классы с событиями
- •Класс sender. Как объявляются события?
- •Делегаты и события
- •Как зажигаются события
- •Классы receiver. Как обрабатываются события
- •Классы с событиями, допустимые в каркасе .Net Framework
- •Пример "Списки с событиями"
- •Класс sender
- •Классы receiver
- •Две проблемы с обработчиками событий
- •Игнорирование коллег
- •Переопределение значений аргументов события
- •Классы с большим числом событий
- •Проект "Город и его службы"
- •22. Лекция: Универсальность. Классы с родовыми параметрами
- •Наследование и универсальность
- •Синтаксис универсального класса
- •Класс с универсальными методами
- •Два основных механизма объектной технологии
- •Стек. От абстрактного, универсального класса к конкретным версиям
- •Ограниченная универсальность
- •Синтаксис ограничений
- •Список с возможностью поиска элементов по ключу
- •Как справиться с арифметикой
- •Родовое порождение класса. Предложение using
- •Универсальность и специальные случаи классов
- •Универсальные структуры
- •Универсальные интерфейсы
- •Универсальные делегаты
- •Framework .Net и универсальность
- •23. Лекция: Отладка и обработка исключительных ситуаций
- •Корректность и устойчивость программных систем
- •Жизненный цикл программной системы
- •Три закона программотехники
- •Первый закон (закон для разработчика)
- •Второй закон (закон для пользователя)
- •Третий закон (закон чечако)
- •Отладка
- •Создание надежного кода
- •Искусство отладки
- •Отладочная печать и условная компиляция
- •Классы Debug и Trace
- •Метод Флойда и утверждения Assert
- •Классы StackTrace и BooleanSwitch
- •Отладка и инструментальная среда Visual Studio .Net
- •Обработка исключительных ситуаций
- •Обработка исключений в языках C/C++
- •Схема обработки исключений в C#
- •Выбрасывание исключений. Создание объектов Exception
- •Захват исключения
- •Параллельная работа обработчиков исключений
- •Блок finally
- •Схема Бертрана обработки исключительных ситуаций
- •Класс Exception
- •Организация интерфейса
- •Форма и элементы управления
- •Взаимодействие форм
- •Модальные и немодальные формы
- •Передача информации между формами
- •Образцы форм
- •Главная кнопочная форма
- •Шаблон формы для работы с классом
- •Работа со списками (еще один шаблон)
- •Элемент управления класса ListBox
- •Наследование форм
- •Два наследника формы TwoLists
- •Огранизация меню в формах
- •Создание меню в режиме проектирования
- •Классы меню
- •Создание инструментальной панели с командными кнопками
- •Рисование в форме
- •Класс Graphics
- •Методы класса Graphics
- •Класс Pen
- •Класс Brush
- •Проект "Паутина Безье, кисти и краски"
- •Паутина Безье
- •Событие Paint
- •Кисти и краски
- •Абстрактный класс Figure
- •Классы семейства геометрических фигур
- •Класс Ellipse
- •Класс Circle
- •Класс LittleCircle
- •Класс Rect
- •Класс Square
- •Класс Person
- •Список с курсором. Динамические структуры данных
- •Классы элементов списка
- •Организация интерфейса
return(next);
}
set
{
next = value;
}
}
public TwoLinkable Prev
{
get
{
return(prev);
}
set
{
prev = value;
}
}
}//class TwoLinkable
}
Организация интерфейса
Создадим теперь интерфейс, позволяющий конечному пользователю работать с объектами наших классов. Как всегда, интерфейс создавался вручную в режиме проектирования. На форме я создал меню с большим числом команд и инструментальную панель с 18 кнопками, команды которых повторяли основную команду меню. Описывать процесс создания интерфейса не буду - он подробно рассмотрен в предыдущей главе. Поскольку вся работа по созданию интерфейса транслируется в программный код формы, то просто приведу этот достаточно длинный текст почти без всяких купюр:
using System;
using System.Drawing; using System.Collections;
using System.ComponentModel; using System.Windows.Forms; using System.Data;
using Shapes;
namespace Final
{
///<summary>
///Эта форма обеспечивает интерфейс для создания,
///рисования, показа, перемещения, сохранения в списке
///и выполнения других операций над объектами семейства
///геометрических фигур. Форма имеет меню и
///инструментальные панели.
///</summary>
public class Form1 : System.Windows.Forms.Form
{
//fields Graphics graphic;
Brush brush, clearBrush; Pen pen, clearPen; Color color;
Figure current; TwoWayList listFigure;
private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.ImageList imageList1; private System.Windows.Forms.ToolBar toolBar1; private System.Windows.Forms.MenuItem menuItem1;
//аналогичные определения для других элементов меню private System.Windows.Forms.MenuItem menuItem35; private System.Windows.Forms.ToolBarButton
toolBarButton1;
//аналогичные определения для других командных кнопок private System.Windows.Forms.ToolBarButton
toolBarButton18;
private System.ComponentModel.IContainer components; public Form1()
{
InitializeComponent();
InitFields();
}
void InitFields()
{
graphic = CreateGraphics(); color = SystemColors.ControlText; brush = new SolidBrush(color);
clearBrush = new SolidBrush(SystemColors.Control); pen = new Pen(color);
clearPen = new Pen(SystemColors.Control); listFigure = new Figure_List();
current = new Person(20, 50, 50);
}
///<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()
{
//Код, инициализирующий компоненты и построенный
//дизайнером, опущен
}
#endregion
///<summary>
///Точка входа в приложение - процедура Main,
///запускающая форму
///</summary>
[STAThread] static void Main()
{
Application.Run(new Form1());
}
private void menuItem7_Click(object sender, System.EventArgs e)
{
createEllipse();
}
void createEllipse()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create ellipse
current = new Ellipse(50, 30, 180,180);
}
private void menuItem8_Click(object sender, System.EventArgs e)
{
createCircle();
}
void createCircle()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create circle
current = new Circle(30, 180,180);
}
private void menuItem9_Click(object sender, System.EventArgs e)
{
createLittleCircle();
}
void createLittleCircle()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create littlecircle
current = new LittleCircle(180,180);
}
private void menuItem10_Click(object sender, System.EventArgs e)
{
createRectangle();
}
void createRectangle()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create rectangle
current = new Rect(50, 30, 180,180);
}
private void menuItem11_Click(object sender, System.EventArgs e)
{
createSquare();
}
void createSquare()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create square
current = new Square(30, 180,180);
}
private void menuItem12_Click(object sender, System.EventArgs e)
{
createPerson();
}
void createPerson()
{
//clear old figure
if (current != null) current.Show(graphic, clearPen, clearBrush);
//create person
current = new Person(20, 180,180);
}
private void menuItem13_Click(object sender, System.EventArgs e)
{
showCurrent();
}
void showCurrent()
{
//Show current current.Show(graphic, pen, brush);
}
private void menuItem14_Click(object sender, System.EventArgs e)
{
clearCurrent();
}
void clearCurrent()
{
//Clear current
current.Show(graphic, clearPen, clearBrush);
}
private void menuItem17_Click(object sender, System.EventArgs e)
{
incScale();
}
void incScale()
{
//Increase scale
current.Show(graphic, clearPen, clearBrush); current.Scale(1.5);
current.Show(graphic, pen, brush);
}
private void menuItem18_Click(object sender, System.EventArgs e)
{
decScale();
}
void decScale()
{
//Decrease scale
current.Show(graphic, clearPen, clearBrush); current.Scale(2.0/3);
current.Show(graphic, pen, brush);
}
private void menuItem19_Click(object sender, System.EventArgs e)
{
moveLeft();
}
void moveLeft()
{
//Move left
current.Show(graphic, clearPen, clearBrush); current.Move(-20,0);
current.Show(graphic, pen, brush);
}
private void menuItem20_Click(object sender, System.EventArgs e)
{
moveRight();
}
void moveRight()
{
//Move right
current.Show(graphic, clearPen, clearBrush); current.Move(20,0);
current.Show(graphic, pen, brush);
}
private void menuItem21_Click(object sender, System.EventArgs e)
{
moveTop();
}
void moveTop()
{
//Move top
current.Show(graphic, clearPen, clearBrush); current.Move(0,-20);
current.Show(graphic, pen, brush);
}
private void menuItem22_Click(object sender, System.EventArgs e)
{
moveDown();
}
void moveDown()
{
//Move down
current.Show(graphic, clearPen, clearBrush); current.Move(0, 20);
current.Show(graphic, pen, brush);
}
private void menuItem23_Click(object sender, System.EventArgs e)
{
//choose color
ColorDialog dialog = new ColorDialog(); if (dialog.ShowDialog() ==DialogResult.OK)
color =dialog.Color;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem24_Click(object sender, System.EventArgs e)
{
//Red color color =Color.Red;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem25_Click(object sender, System.EventArgs e)
{
//Green color color =Color.Green;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem26_Click(object sender, System.EventArgs e)
{
//Blue color color =Color.Blue;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem27_Click(object sender, System.EventArgs e)
{
//Black color color =Color.Black;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem28_Click(object sender, System.EventArgs e)
{
//Gold color color =Color.Gold;
pen = new Pen(color); brush = new SolidBrush(color);
}
private void menuItem29_Click(object sender, System.EventArgs e)
{
//put_left: добавление фигуры в список listFigure.put_left(current);
}
private void menuItem30_Click(object sender, System.EventArgs e)
{
//put_right: добавление фигуры в список listFigure.put_right(current);
}
private void menuItem31_Click(object sender, System.EventArgs e)
{
//remove: удаление фигуры из списка if(!listFigure.empty())
listFigure.remove();
}
private void menuItem32_Click(object sender, System.EventArgs e)
{
goPrev();
}
void goPrev()
{
//go_prev: передвинуть курсор влево if(!(listFigure.Index == 1))
{
listFigure.go_prev(); current = listFigure.item();
}
}
private void menuItem33_Click(object sender, System.EventArgs e)
{
goNext();
}
void goNext()
{
//go_next: передвинуть курсор вправо
if( !(listFigure.Index == listFigure.Count))
{
listFigure.go_next(); current = listFigure.item();
}
}
private void menuItem34_Click(object sender, System.EventArgs e)
{
//go_first listFigure.start(); if(!listFigure.empty())
current = listFigure.item();
}
private void menuItem35_Click(object sender, System.EventArgs e)
{
//go_last listFigure.finish(); if(!listFigure.empty())
current = listFigure.item();
}
private void menuItem15_Click(object sender, System.EventArgs e)
{
showList();
}
void showList()
{
//Show List listFigure.start();
while(listFigure.Index <= listFigure.Count)
{
current = listFigure.item(); current.Show(graphic,pen,brush); listFigure.go_next();
}
listFigure.finish();
}
private void menuItem16_Click(object sender, System.EventArgs e)
{
clearList();
}
void clearList()
{
//Clear List listFigure.start(); while(!listFigure.empty())
{
current = listFigure.item(); current.Show(graphic,clearPen,clearBrush); listFigure.remove();
}
}
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if((current != null) && current.dragged_figure)
{
current.Show(graphic,clearPen,clearBrush); Point pt = new Point(e.X, e.Y); current.center_figure = pt; current.Show(graphic,pen,brush);
}
}
private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
current.dragged_figure = false;
}
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
Point mousePoint = new Point (e.X, e.Y); Rectangle figureRect = current.Region_Capture(); if ((current != null) &&
(figureRect.Contains(mousePoint))) current.dragged_figure = true;
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
//show current figure current.Show(graphic, pen, brush);
}
private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
int buttonNumber = toolBar1.Buttons.IndexOf(e.Button);
switch (buttonNumber)
{
case 0:
createEllipse(); break; case 1:
createCircle(); break; case 2:
createLittleCircle(); break; case 3:
createRectangle(); break; case 4:
createSquare(); break; case 5:
createPerson(); break; case 6:
showCurrent(); break; case 7:
clearCurrent(); break; case 8:
showList(); break; case 9:
clearList(); break; case 10:
incScale(); break; case 11:
decScale(); break; case 12:
moveLeft(); break; case 13:
moveRight(); break; case 14:
moveTop(); break; case 15:
moveDown(); break; case 16:
goNext(); break; case 17:
goPrev(); break;
}
}
}
}
Команд меню и кнопок в нашем интерфейсе много, поэтому много и обработчиков событий, что приводит к разбуханию кода. Но каждый из обработчиков событий довольно прост. Ограничусь кратким описанием главного меню:
•команды пункта главного меню Create позволяют создавать геометрические фигуры разных классов;
•команды пункта главного меню Show позволяют показать или стереть текущую фигуру или все фигуры, сохраняемые в списке;
•две команды пункта Scale позволяют изменить масштаб фигуры (увеличить ее или уменьшить);
•команды пункта Move позволяют перемещать текущую фигуру в четырех направлениях;
•команды пункта Color позволяют либо задать цвет фигур в диалоговом окне, либо выбрать один из предопределенных цветов;
•группа команд пункта List позволяет помещать текущую фигуру в список, перемещаться по списку и удалять из списка ту или иную фигуру;
•командные кнопки инструментальной панели соответствуют наиболее важным командам меню;
•реализована возможность перетаскивания фигур по экрану мышью.
Взаключение взгляните, как выглядит форма в процессе работы с объектами:
Рис. 25.1. Финальный проект. Форма в процессе работы