2. Л.р.№1
Структура консольного
приложения
using System;
namespace ConsoleApplication10
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//}}}
3. Л.р.№1
Структура консольного
приложения
Using сообщает компилятору, где он должен
искать классы (типы), не определенные в данном
пространстве имен.
namespace
ConsoleApplication10
мастер
предложения определяет пространство имен для
нашего приложения.
Строчка[STAThread] является атрибутом
Функция Main определена как статическая
(static) с типом возвращаемого значения void.
4. Л.р.№1
Консольный ввод/вывод
static void Main(string[] args)
{
Console.WriteLine("Введите ваше имя");
string str=Console.ReadLine();
Console.WriteLine("Привет "+str+"!!!");
Console.WriteLine("Введите один символ с
клавитуры");
int kod=Console.Read();
char sim=(char)kod;
Console.WriteLine("Код символа "+sim+" = "+kod);
}
5. Л.р.№1
Консольный ввод/вывод
Для консольного вывода также имеются два
метода:
метод Console.Write(), который выводит
параметр, указанный в качестве аргумента этой
функции,
метод Console.WriteLine(),который работает
так же, как и Console.Write(), но добавляет
символ новой строки в конец выходного текста.
6. Л.р.№1
Консольный ввод/вывод
Для консольного ввода также имеются два
метода:
метод Console.Read(), который возвращает
введенный символ.
метод Console.ReadLine(),который работает так
же, как и Console.Read(), но возвращает строку
введенных символов.
9. Л.р.№2
Поле
Поле – любые переменные объявленные в
классе (член-переменная, содержащая
некоторое значение)
Синтаксис объявления метода:
модификатор_доступа тип имя;
10. Л.р.№2
Константы
Константы – поле, объявленное с
модификатором const (поле, значение
которого изменить нельзя).
Синтаксис объявления констант:
const тип имя;
12. Л.р.№2
Метод
Метод — функция общего назначения.
Различают:
Методы с параметрами (модификаторы ref,
out)
Метод с переменными параметрами
Статические методы
Перегруженные методы
Сокрытые методы
Виртуальные методы
Абстрактные методы
13. Л.р.№2
Метод с параметрами
Методы – аналогичны функциям языка С и
синтаксически объявляются так же:
модификатор_доступа тип_значения
имя_метода(список принимаемых
параметров)
{
…//тело метода
}
14. Л.р.№2
Метод с параметрами
Часто необходимо, чтобы метод возвращал
более одного значения. В C# для этого
используются ключевые слова ref и out:
модификатор_доступа тип_значения
имя_метода(ref тип объект1, out тип объект2)
{
…//тело метода
}
15. Л.р.№2
Метод с переменными
параметрами
Метод с переменными параметрами – метод,
коорому можно передавать произвольное
количество объектов указанного типа.
Компилятор сформирует из них массив,
который и передаст в метод. Внутри метода
все параметры будут видны как массив.
модификатор_доступа тип_значения
имя_метода(param тип[] имя)
{
…//тело метода
}
16. Л.р.№2
Статический метод
Статически объявленные функции (методы)
считаются связанными с классом, а не с
объектом этого класса.
static модификатор_доступа тип_значения
имя_метода(список принимаемых
параметров)
{
…//тело метода
}
18. Л.р.№2
Перегруженный метод
В С# можно объявить несколько функций с
одинаковыми именами. Функции должны
отличаться
списком
принимаемых
параметров. Список может отличаться либо
количеством, либо типом либо порядком
следования параметров. Тип возвращаемого
значения функции роли не играет. При вызове
функций транслятор по списку параметров
определяет, какая именно функция среди
одноименных, должна быть вызвана.
19. Л.р.№2
Сокрытый метод
Если в производном классе объявить функцию с
точно таким же заголовком, что и в базовом
классе, то говорят, что новый метод сокроет
метод базового класса.
20. Л.р.№2
Свойства
Свойства— специфические методы класса
Объявление свойства:
модификатор_доступа тип имя_свойства
{ get {
return значение_переменной;
}
set {
значение_переменной = value;
}
}
21. Л.р.№2
Массивы
Массивы – объекты класса, создание которых
производится точно так же, как и объектов
ссылочного типа.
Различают:
Одномерные массивы
Многомерные массивы
Невыровненные массивы
22. Л.р.№2
Одномерный массив
Поскольку массивы – это объекты класса, то их
создание производится точно так же, как и
объектов ссылочного типа.
Синтакси объявления массива:
тип[] имя;
имя = new тип[размер];
или, что - то же самое:
тип[] имя = new тип[размер];
23. Л.р.№2
Многомерный массив
При объявлении многомерного массива в С# в
квадратных скобках через запятую перечисляют
размерность каждого измерения массива,
например:
float [, ,] ms = new float[3,2,2];
25. Л.р.№2
Индексаторы
Индексаторы – “умные” массивы
Объявление индексатора:
модификатор_доступа тип this[тип имя_индекса]
{
get {
//Возврат необходиммых данных
}
set {
//Установка необходиммых данных
}
}
26. Л.р.№3
Конструктор
Конструктор – специальная функция для
инициализации полей класса.
Различают:
Конструкторы по умолчанию
Статические конструкторы
Перегруженные конструкторы
Вызов конструктора из конструктора
27. Л.р.№3
Конструктор по умолчанию
Конструктор, объявленный без аргументов,
называется конструктором по умолчанию.
Если в классе программистом не определен
конструктор по умолчанию, то, в отсутствии
других конструкторов, компилятор создает его
сам.
Пример конструктора:
class CA{
public CA()
{ //Тело конструктора
}}
28. Л.р.№3
Статический конструктор
Статистический конструктор не имеет
спецификации доступа, так как он никогда не
вызывается кодом C#, а только самой средой
исполнения .NET, и вызывается он только
один раз, до создания какого-либо экземпляра
класса.
Пример конструктора:
class CA{
static public CA()
{ //Тело конструктора
}}
30. Л.р.№3
Конструкторы и поля readonly
Классы могут содержать поля только для
чтения (readonly). Поле только для чтения –
это константное поле, значение которого
изменить нельзя. Начальное значение поля
только для чтения может быть установлено
только внутри конструктора.
31. Л.р.№3
Перегруженный конструктор
В С# можно объявить несколько конструкторов
в одном классе. Конструкторы должны
отличаться
списком
принимаемых
параметров. Список может отличаться либо
количеством, либо типом либо порядком
следования
параметров.
При
вызове
конструктора
транслятор
по
списку
параметров определяет, какой именно
конструктор среди одноименных, должен
быть вызван.
32. Л.р.№3
Вызов конструктора из
конструктора
Для сокращения повторяющего кода
инициализации в C# есть возможность вызова
конструктора из другого конструктора. Для
этого используются ключевые слова this и
base.
33. Л.р.№3
Деструктор
Деструктор – специальная функция для
принудительного освобождения полей класса.
Вызывается при завершении работы с объектом
класса для освобождения системных ресурсов.
34. Л.р.№4
Делегаты
Для передачи ссылки на
методы в качестве
параметров другим методам в язык C# введен новый
тип данных – делегат.
По своей структуре делегат – это объект, который
ссылается на метод, то есть делегат указывает на
адрес области памяти, являющейся точкой входа в
метод.
Синтаксис объявления события:
модификатор_доступа тип delegate
тип_делегата(аргументы);
тип_делегата имя = new
тип_делегата(имя_функции);
35. Л.р.№4
Делегаты
Делегаты реализуются как экземпляры классов,
производных
от
библиотечного
класса
System.Delegate.
Для
создания
делегата
необходимо выполнит два шага.
На первом шаге необходимо объявить делегат.
При этом сигнатура делегата должна полностью
соответствовать сигнатуре метода, который он
представляет.
36. Л.р.№4
Делегат
Делегат должен ссылаться на статический метод
класса СА: static int min(int x,int y), тогда
объявление делегата может
выглядеть,
следующим образом:
delegate int LpFunc(int
a,int b); На втором шаге мы должны создать
экземпляр делегата для хранения сведения о
представляемом им методе: LpFunc pfnk = new
LpFunk(CA.min);
Экземпляр делегата может
ссылаться на любой статический метод или
метод объекта любого класса, при условии, что
сигнатура метода полностью соответствует
сигнатуре делегата.
37. Л.р.№4
События
С помощью событий приложения Windows в С#
получают уведомление, что что-то произошло.
ОС Windows вырабатывает несколько сот
сообщений, уведомляющих приложение о
происходящем. Сообщения Windows относятся к
низкоуровневым структурам языка С. В С#
сообщения ОС оборачиваются
высокоуровневым каркасом, в котором события
являются объектами, призванными упростить
задачу программиста по обработке сообщений
Windows.
38. Л.р.№4
События
Обработчик события определяется делегатом.
Согласно сигнатуре обработчика события
делегат должен принимать два параметра и
выглядеть следующим образом:
public delegate void ChangeEventHandle(object
source,ChangeEventArgs e);
39. Л.р.№4
События
События – являются членами класса,
позволяющие объекту класса информировать
клиента класса об изменениях (событиях),
произошедших при выполнении кода.
Синтаксис объявления события:
модификатор_доступа тип delegate
тип_делегата(аргументы);
модификатор_доступа event тип_делегата
имя_события;
40. Л.р.№5
Windows-приложение
Пространство имен System. Windows. Forms
содержит все классы для создания
пользовательских приложений под Windows.
Каждое приложение Windows представляет
собой объект класса, являющийся производным
от System. Windows. Forms.Form.
41. Л.р.№5
Технология быстрой разработки
приложений RAD
Создание элементов управления и задание их
свойств
При определении свойств объекта мастер
приложения добавляет для каждого элемента
управления свойство TabIndex
В классе формы мастером создается закрытый
объект контейнерного типа
42. Л.р.№5
Технология быстрой разработки
приложений RAD
Мастер приложения в классе формы
производит переопределение виртуальной
функции Dispose() базового класса
Добавление
элементов
на
осуществляется путем вызова
Controls.AddRange()
форму
функции
44. Л.р.№5
Модификаторы доступа
public – общедоступный (доступ вне класса)
protected – защищенный член, к нему могут
обращаться только члены данного класса и
производных от него классов
private – член доступен только членам данного
класса (производным классам он не доступен)
internal – член доступен только в пределах
данной сборки и нигде больше
46. Л.р.№6
Структура Size
Структура Size предназначена для хранения
ширины и высоты объекта и имеет, для этого,
соответствующие открытые свойства Width и
Height, доступные как для записи, так и для
чтения. Для создания объекта Size с нулевыми
значениями Width и Height с помощью
конструктора по умолчанию, используется
следующую запись:
Size sz = new Size();
47. Л.р.№6
Структура Point
Структура Point содержит открытые свойства X
и Y целого типа, доступные, как для записи, так
и для чтения.
Для создания точки “pt” можно
использовать конструктор по умолчанию:
Point pt = new Point();
49. Л.р.№6
Представление цвета
Представление цвета осуществляется с помощью
экземпляров структуры System.Drawing.Color.
Для задания цвета используется статический
метод класса:
public static Color.FromArgb( int red, int green, int
blue);
50. Л.р.№6
Кисти
Кисти
описываются
объектами
классов,
производных от класса System.Drawing.Brush.
Класс Brush является абстрактным классом, то
есть нельзя создать объект этого класса.
Сплошные кисти создаются как экземпляры
класса System.Drawing.SolidBrush, например:
Brush br2 = new SolidBrush(Color.Magenta);
Brush br3 = new
SolidBrush(Color.FromArgb(200,10,120));
51. Л.р.№6
Перья
Перья описываются классом
System.Drawing.Pen. В классе
System.Drawing.Pens содержится множество
статических свойств, описывающих перья с
интернет цветом и толщиной в один пиксель.
Создание таких перьев выглядит следующим
образом:
Pen pn6 = Pens.Brown;
Pen pn7 = Pens.Magenta;
52. Л.р.№6
Интерфейс GDI+
Разработчики среды .NET - предлагают новый
интерфейс графического устройства - GDI+.
GDI+ - представляет по сути дела объектноориентированную оболочку GDI с новыми
свойствами и при этом, если верить заявлению
компании
Microsoft,
удалось
повысить
быстродействие системы.
53. Л.р.№6
Рисование линий и фигур
Контекст устройства в среде .NET
инкапсулирован («завернут») в базовом классе
System.Drawing.Graphics. Для создания объекта
класса Graphics необходимо использовать
метод CreateGraphics(), возвращающий ссылку
на объект класса Graphics и затем через данный
объект рисовать объекты:
Graphics dc = CreateGraphics();
dc.DrawRectangle(Pens.OrangeRed,5,10,25,45);
54. Л.р.№6
Рисование текста
Для рисования текста используют
перегруженный метод DrawString.Для вывода
текста необходимо задать тип и размер шрифта,
кисть и координаты текста. Например:
Font fnt = new Font("Arial",10); //Шрифт
Arial, размер 10
dc.DrawString("Привет!",fnt,
Brushes.Green,10,20);
55. Л.р.№6
Рисование изображений
Вывод изображений осуществяется с помощью
класса Image:
Graphics g = e.Graphics;
Image curImage =
Image.FromFile("имя_изображения");
g.DrawImage(curImage, 10, 10);
56. Л.р.№6
Рисование анимации
Для вывода анимаций использется класс Animate
и Image. Создается объект класса Image, в
который загружается GIF изображение. Далее с
помощью встроенных событий смены кадра
происходит перерисовка изображения.
57. Л.р.№6
Перерисовка приложения
Восстановлением графики и текста должно
заниматься само приложение. Операционная
система в необходимых случаях вырабатывает
сообщение (событие Paint), которое «говорит»,
что окно приложения не корректно и его
необходимо перерисовать. Перерисовка окна
должна происходить по событию Paint.
58. Л.р.№7
Создание меню
Для создания меню и контекстного меню
необходимо перенести из ToolBox на
поверхность формы MainMenu и ContextMenu.
Необходимо добавить в пункты «большой» и
«маленький». Для этого выделяем mainMenu1 и
добавляем данные пункты.
В контекстное меню contextMenu1 добавляем
пункты «красный» и «синий» аналогичным
способом.
59. Л.р.№7
Создание меню
Создадим переменные, с которыми связаны все
изменения прямоугольника:
private int width;
private int height;
private Color myColor;
Инициализируем их в конструкторе Form1():
public Form1() {
InitializeComponent();
myColor = Color.Red;
width = 10;
height = 10; }
60. Л.р.№7
Создание меню
В свойствах формы создадим, методобработчик события Paint и отредактируем его,
чтобы он имел вид:
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Graphics dc = e.Graphics;
Pen myPen = new Pen(myColor);
dc.DrawRectangle(myPen,50,50,width,height);
}
61. Л.р.№7
Создание меню
Выделим mainMenu1 и двойным щелчком
мыши на пункте “Большой” создадим методобработчик выбора данного пункта.
Отредактируем тело метода, после чего оно
должно иметь вид:
private void menuItem2_Click(object
sender, System.EventArgs e)
{
width = 100;
height = 100;
Invalidate();
}
62. Л.р.№7
Создание меню
Аналогично для пункта “Маленький”:
private void menuItem3_Click(object
sender, System.EventArgs e)
{
width = 10;
height = 10;
Invalidate();
}
63. Л.р.№7
Создание меню
Для пункта contextMenu1 “Красный”:
private void menuItem4_Click(object
sender, System.EventArgs e)
{
myColor = Color.Red;
Invalidate();
}
64. Л.р.№7
Создание меню
Для contextMenu1 “Синий”:
private void menuItem5_Click(object
sender, System.EventArgs e)
{
myColor = Color.Blue;
Invalidate();
}
65. Л.р.№7
Создание меню
Для вывода контекстного меню на экран в
свойствах формы создаем метод-обработчик
события нажатия клавиши мыши, после
редактирования метод должен иметь вид:
private void Form1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
Point myPoint = new Point(e.X,e.Y);
if(e.Button.ToString() == "Right")
contextMenu1.Show(this,myPoint);
}
66. Л.р.№8
Потоки
Выполнение кода в С# всегда начинается с
метода Main. Метод Main - образует главный
поток приложения. Поток представляет собой
последовательность операций исполняемых в
программе. Главный поток может запустить
несколько подчиненных или говорят рабочих
потоков.
67. Л.р.№8
Потоки
Многопоточная система инкапсулирована в
класс Thread. Данный класс объявлен как
запечатанный (sealed) класс, то есть от него
нельзя породить новый класс. В классе Thread
определено ряд свойств и методов для
управления потоками.
68. Л.р.№8
Создание потока
Для создания потока необходимо создать объект
класса Thread.
Один из конструкторов этого класса имеет
следующий вид:
public Thread ( ThreadStart start)
69. Л.р.№8
Приоритеты потоков
Каждый поток имеет определенный приоритет.
Потоки с более высоким приоритетом имеют
преимущество перед другими потоками и могут
полностью блокировать работу потоков с более
низкими приоритетами. Приоритет потока
можно прочитать или изменить с помощью
свойства Priority, которое является членом
класса Thread.
73. Л.р.№8
Синхронизация потоков
В основе синхронизации лежит понятие
блокировки, т.е. управление доступом к
некоторому блоку кода в объекте. На то время,
когда объект заблокирован одним потоком,
никакой другой поток не может получить доступ
к блоку кода для работы с этим объектом.