1. Темы лекции: Введение. Обзор C#.
Практическое задание: Базовые понятия языка C#
Тренер: Игорь Шкулипа, к.т.н.
Платформа .Net и язык программирования C#.
Занятие 1
2. http://www.slideshare.net/IgorShkulipa 2
Курс «Платформа .Net и язык программирования C#»
Курс состоит из трех основных модулей:
1. Базовые понятия ООП и языка программирования С#
• Обзор C#
• ООП на C#
• Перегрузка операций и обработка исключений
• Стандартный ввод-вывод
• Обобщения
• Строки, массивы, коллекции
• Делегаты, события, анонимные методы, лямбда-выражения
2. Организация взаимодействия с базами данных и
приложениями
• Windows Forms
• XML
• Windows Presentation Foundation
• ADO.Net
• COM Interop
• LINQ
3. Дополнительные темы
• Динамические типы
• Многопоточность в C#
• Модульное тестирование ПО (unit testing)
• Паттерны проектирования
3. http://www.slideshare.net/IgorShkulipa 3
Время и оценка результатов курса
Курс состоит из 25 занятий, общей длительностью 100 часов аудиторной
работы.
Оценка теоретической части:
1. Два промежуточных теста (максимальная оценка - 100 баллов)
2. Результирующий тест (максимальная оценка - 100 баллов)
Оценка практической части:
1. Групповой проект (максимальная оценка – 100 баллов)
2. 15 лабораторных работ (максимальная средняя оценка - 100
баллов)
Курсовой проект:
1. На протяжении курса студенты выполняют курсовой проект по
индивидуальной теме (максимальная оценка - 100 баллов)
4. http://www.slideshare.net/IgorShkulipa 4
Результирующий рейтинг
>= 70% < 70%
• TP – средняя оценка за промежуточные тесты (макс. 100)
• TR – оценка за результирующий тест (макс. 100)
• LR – средняя оценка за выполнение лабораторных работ (макс. 100)
• GP – средняя оценка за групповой проект (макс. 100)
• CP – оценка за курсовой проект (макс. 100)
Результат курса = 0.15*TP + 0.15*TR + 0.2*LR +0.2*GP+ 0.3*CP
5. http://www.slideshare.net/IgorShkulipa 5
Литература
1. Джеффри Рихтер / CLR via C#. Программирование на платформе
Microsoft .NET Framework 4.0 на языке C#: Питер, 2011, 928 с.
1. Троелсен Эндрю / Язык программирования C# 5.0 и платформа
.NET 4.5, 6-е изд.: Пер. с англ.: Изд. дом «Вильямс», 2013. - 1312
c.
1. Трей Неш / C# 2010: ускоренный курс для профессионалов:
Пер. с англ.: Изд. дом «Вильямс», 2010. - 592 c.
1. http://msdn.microsoft.com/library/vstudio/
1. Руководство Microsoft по проектированию архитектуры
приложений. 2-е издание.
6. http://www.slideshare.net/IgorShkulipa 6
Объектно-ориентированное программирование
ООП – это парадигма программирования, основанная на
представлении предметной области в виде взаимосвязанных
абстрактных объектов и их реализаций.
В ООП вводится понятие Класса – пользовательского типа
данных, объединяющего данные и методы их обработки.
Объектом называется экземпляр класса.
Автомобиль– это класс (тип данных)
Автомобиль Bentley Continental GT черного цвета – это объект,
или экземпляр класса «Автомобиль»
7. http://www.slideshare.net/IgorShkulipa 7
Объекты
Объекты характеризуются понятиями состояния, поведения и идентичности.
Состояние объекта характеризуется перечнем всех свойств данного
объекта и текущими значениями каждого из этих свойств.
Поведение - это то, как объект действует и реагирует; поведение
выражается в терминах состояния объекта и передачи сообщений.
Поведение объекта - это его наблюдаемая и проверяемая извне
деятельность.
Поведение объекта строится из его операций (определенное воздействие
одного объекта на другой ). Существует три вида операций
• Модификатор - операция, которая изменяет состояние объекта
• Селектор - операция, считывающая состояние объекта, но не
меняющая состояния
• Итератор - операция, позволяющая организовать доступ ко всем
частям объекта в строго определенной последовательности
Идентичность - это такое свойство объекта или такой набор свойств,
который отличает его от всех других объектов.
8. http://www.slideshare.net/IgorShkulipa 8
Члены и методы класса
Члены-данные (поля) (data members) хранят всю необходимую
информацию об объекте, формируют его состояние,
характеристики и т.п.
Изменение состояния объекта или его характеристик связано с
изменением данных, которые в нем содержатся.
Метод объекта (methods) – программный код, выполненный в
виде функции, реагирующий на передачу объекту
определенного сообщения.
Вызов метода объекта может приводить к изменению его
состояния (значение членов-данных), а может и не приводить
Класс может содержать один или более методов, позволяющих
осуществлять манипуляцию данными объекта
9. http://www.slideshare.net/IgorShkulipa 9
Свойства
Свойство – составляющая часть объекта, доступ к которой
осуществляется как к члену объекта, но таковым не является
(реализуют принцип инкапсуляции для членов объекта).
В некоторых объектно-ориентированных языках
программирования (например, в C++) свойства, как элемент
языка, отсутствуют.
В этом случае в класс добавляют методы, посредством которых
осуществляется доступ к необходимым переменным класса.
10. http://www.slideshare.net/IgorShkulipa 10
Абстракция данных
Объекты представляют неполную информацию о реальных
сущностях предметной области.
Абстракция позволяет оперировать с объектном на уровне,
адекватном решаемой задаче.
Высокоуровневые обращения к объекту могут обрабатываться с
помощью вызова функций и методов низкого уровня.
В основе реализации этого принципа лежит использование
абстрактных классов интерфейсов.
11. http://www.slideshare.net/IgorShkulipa 11
Инкапсуляция
Инкапсуляция – объединение в одной оболочке данных и
методов их обработки, а так же способность объекта скрывать
внутреннее устройство своих полей и методов.
Согласно данному принципу, класс должен рассматриваться как
черный ящик.
Внешний пользователь не знает детали реализации объекта и
работает с ним только путем предоставленного объектом
интерфейса (или открытых методов доступа).
Следование данному принципу может уменьшить число связей
между классами и упростить их независимую реализацию,
модификацию и тестирование.
12. http://www.slideshare.net/IgorShkulipa 12
Композиция классов
Композиция (а так же ассоциация и агрегирование) – механизм
для создания нового класса путем объединения нескольких
объектов существующих классов в единое целое.
При агрегировании между классами действует «отношение
принадлежности»
• У машины есть кузов, колеса и двигатель
• У человека есть голова, руки, ноги и тело
• У треугольника есть вершины
Вложенные объекты обычно объявляются закрытыми (private)
внутри класса-агрегата
13. http://www.slideshare.net/IgorShkulipa 13
Наследование
Наследование – это механизм ООП, позволяющий описать новый
класс на основе уже существующего.
При наследовании свойства и функциональность родительского
класса наследуются новым классом.
Класс-наследник имеет доступ к публичным (public) и
защищенным (protected) методам и полям класса родительского
класса.
Класс-наследник может добавлять свои данные и методы, а также
переопределять методы базового класса
14. http://www.slideshare.net/IgorShkulipa 14
Основные термины
Родительский или базовый класс (класс-родитель) – класс,
выступающий в качестве основы при наследовании.
Класс-потомок (дочерний класс, класс-наследник) – класс,
образованный в результате наследования от родительского
класса.
Иерархия наследования – отношения между родительским
классом и его потомками.
Интерфейс класса – совокупность публичных методов класса,
доступная для использования вне класса. В интерфейсной части
данные обычно не размещают.
Реализация класса – совокупность приватных методов и
данных класса
15. http://www.slideshare.net/IgorShkulipa 15
Виды наследования
По типу наследования:
• Открытое (public) наследование
• Закрытое (private) наследование
• Защищенное (protected) наследование
По количеству базовых классов:
• Одиночное наследование (один базовый класс)
• Множественное наследование (два и более базовых классов)
16. http://www.slideshare.net/IgorShkulipa 16
Полиморфизм
Полиморфизм - это свойство, которое позволяет одно и то же имя
использовать для решения нескольких схожих, но технически
разных задач. Целью полиморфизма является использование
одного имени для задания общих для класса действий.
Использование полиморфизма достигается при присвоении
указателю на базовый класс адреса производного класса с
переопределенными методами.
Типы-наследники неявно приводимы к базовому классу.
17. http://www.slideshare.net/IgorShkulipa 17
Microsoft .NET Framework
Платформа .NET Framework является надстройкой над операционной
системой, в качестве которой может выступать любая версия
Windows.
На сегодняшний день платформа .NET Framework включает в себя:
1. Компиляторы четырех официальных языков: С#, VB.NET, Managed
C++ (управляемый C++) и JScript .NET
2. Объектно-ориентированную среду CLR (Common Language Runtime),
совместно используемую этими языками для создания приложений
под Windows и для Internet
3. Ряд связанных между собой библиотек классов под общим именем
FCL (Framework Class Library)
19. http://www.slideshare.net/IgorShkulipa 19
C# и CLR
Самым важным компонентом платформы .NET Framework является CLR
(Common Language Runtime), предоставляющая среду, в которой
выполняются программы.
Главная ее роль заключается в том, чтобы обнаруживать и загружать
типы .NET и производить управление ими в соответствии с
полученными командами. CLR включает в себя виртуальную
машину, во многих отношениях аналогичную виртуальной машине
Java. На верхнем уровне среда активизирует объекты, производит
проверку безопасности, размещает объекты в памяти, выполняет
их, а также запускает сборщик мусора.
Код на языке C# компилируется в, так называемый CIL ( Common
Intermediate Language) - стандартизированный промежуточный
язык, чем-то похожий на объектно-ориентированный ассемблер.
Код на CIL выполняется виртуальной машиной CLR, а результат в виде
шестнадцатеричных команд отправляется на выполнение
операционной системой.
20. http://www.slideshare.net/IgorShkulipa 20
JIT-компилятор
Среда CLR – это не интерпретатор, как может показаться на первый
взгляд.
В действительности, CLR компилирует код IL в машинный код, прежде
чем выполнить его, то есть осуществляет JIT (Just in Time)
компиляцию.
Этот процесс может показаться неэффективным, но, на самом деле,
это обозначает лишь одноразовое понижение производительности
для каждого участка программы. Как только код один раз
скомпилирован, CLR сохраняет его и выполняет каждый раз, когда
это необходимо.
Код, выполняемый CLR называется управляемым кодом (managed
code)
21. http://www.slideshare.net/IgorShkulipa 21
Преимущества управляемого кода
• Управляемые приложения могут потреблять меньше памяти.
IL-код занимает меньше места в памяти, чем «родной» код, то есть
количество памяти у управляемых приложений, обычно, меньше,
чем у «родных».
• JIT-компиляции подвергается только тот код, который
выполняется. IL-код более компактен, чем машинный, по этому
сокращение компилируемого кода до минимума сокращает объем
памяти приложения.
• Код более оптимизирован. Код после JIT-компиляции
оптимизируется непосредственно для платформы, на которой он
выполняется.
• Среда CLR отслеживает частоту вызовов. Если CLR видит, что
некоторый код долгое время не вызывался, то она может
освободить память, занимаемую им. При следующем обращении,
этот код будет перекомпилирован.
• Автоматическая сборка мусора. Нет необходимости в ручном
управлении памятью и освобождении занятых ресурсов.
22. http://www.slideshare.net/IgorShkulipa 22
Сборки
Сборка (assmebly) – это дискретная единица многократно
используемого кода внутри CLR. Сборки похожи на обычные DLL
библиотеки или исполняемые EXE файлы.
Сборка может состоять из многих модулей, которые объединяет вместе
манифест, описывающий содержимое сборки.
Сборки могут иметь версии, что позволяет идентифицировать
одноименные сборки с разными версиями.
Сборки содержат метаданные, описывающие содержащиеся в них
типы.
Загрузчик сборок с помощью конфигурационных файлов системы,
определяет, какую версию сборки необходимо загрузить в данный
момент.
23. http://www.slideshare.net/IgorShkulipa 23
Назначение сборкам имен
• Строгое именование. Такая сборка имеет имя, состоящее из
четырех частей: краткое имя сборки, номер версии, идентификатор
культуры и хеш-маркер.
• Частичное именование. Сборка имеет имя, в котором опущены
некоторые части строгого имени.
GAC (Global Assembly Cache) – некоторое подобие реестра сборок.
Регистрация сборки в GAC подобна регистрации приложения в
системном реестре.
Если сборка зарегистрирована со строгим именованием, то она может
быть использована всеми приложениями системы.
Сборки с частичным именованием могут использоваться только
локальными приложениями, то есть сама сборка должна находиться
где-нибудь в каталоге приложения или в подкаталогах.
24. http://www.slideshare.net/IgorShkulipa 24
Метаданные
Метаданные – это расширяемый формат описания содержимого сборок.
Можно определять собственные специальные атрибуты, которые легко
включаются в метаданные типа.
Почти любая сущность программы может иметь присоединенные к ней
метаданные, включая классы, методы, параметры, возвращаемые
значения и т.д.
С помощью метаданных можно исследовать определения типов и
присоединенные к ним атрибуты.
Метаданные могут сообщить о том, поддерживает некоторый класс
определенный метод, прежде чем пытаться взывать его, или порожден
ли этот класс от какого-либо другого класса.
Процесс просмотра метаданных называется рефлексией. Для этого служат
оператор typeof (работает во время компиляции) или метод GetType()
(работает во время выполнения), которые возвращают объект типа
System.Type.
25. http://www.slideshare.net/IgorShkulipa 25
Сборщик мусора
Сборка мусора представляет собой непрерывный процесс слежения за
состоянием памяти. Однако, активную фазу принимает в основном в
момент острого недостатка памяти для продолжения работы приложения.
Сборщик мусора всегда запускается в отдельном потоке и в момент его
активной работы, все остальные потоки приложения приостанавливаются.
Сборщик мусора не проходит по всем находящимся в памяти объектам и не
изучает их. Вместо этого CLR выполняет проход по определенной группе
объектов. В .NET эти группы называются поколениями:
• Поколение 0. Новый созданный объект, который еще никогда не
помечался как кандидат на удаление;
• Поколение 1. Объект, который уже однажды пережил сборку
мусора. Сюда обычно попадают объекты, которые были помечены для
удаления, но все-таки не удалены из-за того, что места в памяти
(куче) было достаточно;
• Поколение 2. Объекты, которые пережили более одной очистки
памяти сборщиком мусора.
Очевидно, что чем выше поколение объекта, то тем дольше он находится в
памяти. Более того, вероятность дальнейшего его существования в куче
больше, чем у объекта более низкого поколения.
26. http://www.slideshare.net/IgorShkulipa 26
Язык C#
Язык C# был разработан, как основной язык программирования для
платформы Microsoft .NET Framework.
Разработан в 1998—2001 годах группой инженеров под руководством
Андерса Хейлсберга в компании Microsoft.
Синтаксис C# основан на языках C++ и Java – в то время,
доминирующих языках в разработке программного обеспечения.
C# - строго типизированный язык, то есть каждая переменная и
экземпляр класса относятся к четко определенному типу.
27. http://www.slideshare.net/IgorShkulipa 27
Базовые типы данных
СТS Тип
Имя псевдонима в
С#
Описание
System.Object object Класс , базовый для всех типов (CTS)
System.String string Строка
System.SByte sbyte 8 -разрядный байт (со знаком)
System.Byte byte 8 -разрядный байт (без знака)
System.Int16 short 16-разрядное число (со знаком)
System.UInt16 ushort 16-разрядное число (без знака)
System.Int32 int 32-разрядное число (со знаком)
System.UInt32 uint 32-разрядное число (без знака)
System.Int64 long 64-разрядное число (со знаком)
System.UInt64 ulong 64-разрядное число (без знака)
System.Char char 16-разрядный символ (Unicode)
System.Single float 32-разрядное число с плавающей точкой, (стандарт IEEE)
System.Double double 64-разрядное число с плавающей точкой, (стандарт IEEE)
System.Boolean bool Булевское значение (true/false)
System.Decimal decimal Данный 128 разрядный тип используется в основном, когда
требуется крайне высокая точность (до 28 знака)
Встроенные числовые типы являются структурами, и к их свойствам и
методам можно получить доступ.
30. http://www.slideshare.net/IgorShkulipa 30
Типы CLR
• Типы значений (value types). Определяются с помощью
ключевого слова struct. Экземпляры типов значений – это
единственные экземпляры, которые могут располагаться в стеке
приложения. В управляемой куче они могут располагаться, если
они являются членами ссылочных типов. Во многом аналогичны
структурам С++.
• Ссылочные типы (reference types). Определяются с помощью
ключевого слова class, в стеке приложения находится ссылка на
экземпляр. Сами экземпляры располагаются в управляемой куче.
31. http://www.slideshare.net/IgorShkulipa 31
Типы значений
Типы значений являются производными от System.ValueType,
являющегося производным от System.Object. Типы, производные от
System.ValueType, имеют особое поведение в среде CLR.
Переменные типа значения напрямую содержат их значения, что
означает, что память встроена в контекст, в котором объявлена
переменная. Не существует отдельного размещения кучи или
служебных данных сборки мусора для переменных типа значения.
Существует две категории типов значений: структура и
перечисление.
Типы значений являются запечатанными, что означает, например, что
нельзя произвести тип от System.Int32, и нельзя определить
структуру для наследования от любого пользовательского класса
или структуры, поскольку структура может наследовать только от
System.ValueType.
Однако структура может реализовать один или несколько
интерфейсов. Можно выполнить приведение типа структуры в тип
интерфейса; это приведет к операции упаковки-преобразования
для создания программы-оболочки структуры внутри объекта
ссылочного типа в управляемой куче.
32. http://www.slideshare.net/IgorShkulipa 32
Структуры
Ключевое слово struct используется для создания собственных
пользовательских типов значений. Обычно структура используется
как контейнер для небольшого набора связанных переменных
public struct Coords
{
public int x, y;
public Coords(int p1, int p2)
{
x = p1; y = p2;
}
}
33. http://www.slideshare.net/IgorShkulipa 33
Перечисления
Другой категорией типов значений является перечисление.
Перечисление определяет набор именованных интегральных
констант. По умолчанию базовым типом каждого элемента
перечисления является int. Можно задать другой целочисленный
тип, используя двоеточие.
public enum FileMode
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6
}
enum Days
{
Sunday, Monday, Tuesday,
Wednesday, Thursday,
Friday, Saturday
};
enum Months : byte
{
Jan, Feb, Mar, Apr, May,
Jun, Jul, Aug, Sep, Oct,
Nov, Dec
};
34. http://www.slideshare.net/IgorShkulipa 34
Ссылочные типы
Часто определяются с помощью ключевого слова class. Фактически
переменные ссылочных типов подобны переменным типов
значений, которые имеют тип и содержат указатель на объект в
куче.
Все ссылочные типы неявно наследуются от System.Object (object).
По соглашению термином «объект» обозначается экземпляр
ссылочного типа, а термином «значение» - типа значений.
Переменные ссылочного типа инициализируются либо с помощью
операции new, либо присваиванием переменной значения
совместимого типа.
object o1= new object();
object o2= o1;
CLR управляет всеми ссылками на объекты в куче, в том числе
выполняет сборку мусора, так что нет необходимости в ручном
освобождении памяти.
35. http://www.slideshare.net/IgorShkulipa 35
Инициализация переменных по умолчанию
Когда создается объект, система инициализирует его поля,
значениями по умолчанию:
1. Поля, относящиеся к типам значений, инициализируются
установкой всех битов в 0.
1. Значением по умолчанию для ссылок на объекты является null.
1. Поля логического типа инициализируются значением false.
36. http://www.slideshare.net/IgorShkulipa 36
Неявно типизированные переменные
Объявляя локальную переменную с помощью ключевого слова var, вы
просите компилятор зарезервировать некоторый участок памяти
для хранения этой переменной.
На этапе компиляции у компилятора достаточно информации о типе
будущего экземпляра, так как его тип указан явно.
var MyList = new List<int>();
MyList.Add(1); MyList.Add(2); MyList.Add(3);
foreach(var i in MyList)
{
Console.WriteLine(i);
}
(!) Замечание: Неявно типизированные переменные должны быть
проинициализированы.
var WrongValue; // выдаст ошибку компиляции
37. http://www.slideshare.net/IgorShkulipa 37
Преобразование типов
1. Присвоение "большему типу" значения "меньшего типа". Безопасное
присвоение, гарантирует сохранение значения.
int IntValue = 12345678;
long LongValue = 1234567890;
LongValue=IntValue;
2. Присвоение "меньшему типу" значения "большего типа“ должно быть
явным. Потенциально опасное присвоение, грозит потерей информации.
int IntValue = 12345678;
long LongValue = 1234567890;
IntValue = (int) LongValue;
3. Ссылка на DerivedType может быть неявно преобразована к BaseType,
если DerivedType унаследован от BaseType.
BaseType DT = new DerivedType();
4. Ссылка на BaseType должна преобразовываться к DerivedType явно. Но
такое явно преобразование может сгенерировать InvalidCastException во
время выполнения программы, если CLR не сможет выполнить такое
преобразование.
BaseType BT = new BaseType();
DerivedType DT = new DerivedType();
DT = (DerivedType)BT; // Небезопасно!!!
38. http://www.slideshare.net/IgorShkulipa 38
Операции as и is
Операция is возвращает булевское значение, говорящее о том, можно
ли преобразовать данное выражение в указанный тип:
long LValue=123;
bool IsInt= LValue is int;
DerivedClass DC=new DerivedClass();
bool IsBase=DC is BaseClass;
Операция as подобна is, но она возвращает ссылку на уже
преобразованный объект указанного типа, либо null, если такое
преобразование невозможно.
BaseClass BC=DC as BaseClass;
39. http://www.slideshare.net/IgorShkulipa 39
Пространства имен
Пространства имен (namespace) предоставляют программистам возможность
логичной взаимосвязи классов и других типов. Само понятие namespace
скорее является логическим, нежели физическим.
namespace NameSpace
{
public struct Name
{
// Код структуры ...
}
}
Для использования имен из пространства имен существует директива using.
using NameSpace;
using System;
using System.Collections;
using Microsoft.Office.Interop.Excel;
Еще одним применением ключевого слова using в C# является назначение
псевдонимов классам и пространствам имен:
using alias = NameSpace;
using alias = System.Collections;
...
alias.ArrayList AL = new alias.ArrayList();
40. http://www.slideshare.net/IgorShkulipa 40
Операторы
Синтаксис операторов C# аналогичен синтаксису операторов С++.
if-else, while, do-while, for, switch
В операторе switch, обязательно должен присутствовать оператор
break или другая передача управления.
break, continue, goto, return, throw
Оператор foreach используется для итерации по коллекции или
массиву объектов.
string[] strings=new string[5];
...
foreach (string item in strings)
{
Console.WriteLine(item);
}
41. http://www.slideshare.net/IgorShkulipa 41
Нововведения версий C#
C# 2.0
• Поддержка обобщений
• Поддержка анонимных методов
• Поддержка итераторов
• Поддержка частичных типов (partial)
C# 3.0
• LINQ
• Автореализуемые свойства (get, set)
• Расширяющие методы
C# 4.0
• Динамические типы (dynamic)
• Облегчение взаимодействия с COM
• Ключевые слова in и out
C# 5.0
• Поддержка выполнения асинхронных
функций с помощью двух новых ключевых
слов – async и await
43. http://www.slideshare.net/IgorShkulipa 43
Hello, World!!!
// Используемые пространства имен
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// Пространство имен приложения
namespace HelloWorld
{
// Основной класс программы
class Program
{
// Статичный метод – точка входа в приложение
static void Main(string[] args)
{
// Вывод в консоль "Hello, World!!!"
Console.WriteLine("Hello, World!!!");
// Ожидание нажатия клавиши
Console.ReadKey();
}
}
}
44. http://www.slideshare.net/IgorShkulipa 44
Лабораторная работа №1. Базовые понятия языка C#
Создать консольное приложение на языке C#, которое реализует
следующие задания:
1. Вычислить an, а – действительное число. При этом, не пользуясь
никакими другими арифметическими операциями, кроме умножения.
2. В числе х, содержащем более двух, знаков зачеркнули его вторую
цифру. Когда к образованному при этом числу справа приписали
вторую цифру числа х, то получилось число n. По заданному n найти
число х (значение n вводится с клавиатуры, n >= 100 ).