- •Введение
- •Сравнение языков С++ и C#
- •Логические выражения
- •Функции для ввода и вывода в языке C#
- •Управление форматом числовых данных:
- •Обработка исключительных ситуаций
- •Методы и модификаторы параметров
- •Неявно типизированные переменные
- •Понятие класса
- •Свойства
- •Индексаторы
- •Одномерные индексаторы
- •Многомерные индексаторы
- •Перегрузка методов
- •Перегрузка знаков операций
- •Наследование
- •Виртуальные функции
- •Работа с файлами
- •Работа с каталогами
- •Абстрактный класс FileSystemInfo
- •Класс DirectoryInfo
- •Сериализация
- •FileSystemWatcher – отслеживание событий, связанных с файлами
- •Обобщения (шаблоны)
- •Интерфейсы
- •Коллекции
- •LINQ
- •Грамматика выражений запросов
- •Синтаксис запросов
- •Проекция и фильтрация
- •Упорядочение
- •Агрегирующие запросы
- •Операции с коллекциями
- •Операция Concat
- •Операция Union
- •Преобразование
- •Объединение последовательностей
- •FirstOrDefault
- •Группировка
- •Групповая адресация
- •Обработка событий
- •Групповое преобразование делегируемых методов
- •Применение методов экземпляра в качестве делегатов
- •Групповая адресация
- •Ковариантность и контравариантность
- •Класс System. Delegate
- •Назначение делегатов
- •Анонимные функции
- •Анонимные методы
- •Передача аргументов анонимному методу
- •Возврат значения из анонимного метода
- •Применение внешних переменных в анонимных методах
- •Лямбда-выражения
- •Лямбда-оператор
- •Одиночные лямбда-выражения
- •Блочные лямбда-выражения
- •События
- •Пример групповой адресации события
- •Применение аксессоров событий
- •Разнообразные возможности событий
- •Применение анонимных методов и лямбда-выражений вместе с событиями
- •Рекомендации по обработке событий в среде .NET Framework
- •Применение делегатов EventHandler<TEventArgs> и EventHandler
- •Практический пример обработки событий
МОСКОВСКИЙ АВТОМОБИЛЬНО-ДОРОЖНЫЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
(МАДИ)
Чернов Э. А.
Лекции по языку Visual С#
Конспект лекций
МАДИ 2014
V2.3
Чернов Э. А. - 2 - Лекции по языку C# v 2.3
Лекции по языку C#
Версия 2.3
Содержание |
|
Введение......................................................................................................................................... |
4 |
Сравнение языков С++ и C#..................................................................................................... |
7 |
Логические выражения............................................................................................................. |
9 |
Функции для ввода и вывода в языке C# .............................................................................. |
15 |
Управление форматом числовых данных: ............................................................................ |
16 |
Обработка исключительных ситуаций.................................................................................. |
18 |
Методы и модификаторы параметров................................................................................... |
28 |
Неявно типизированные переменные.................................................................................... |
30 |
Понятие класса............................................................................................................................. |
31 |
Свойства................................................................................................................................... |
38 |
Индексаторы ............................................................................................................................ |
41 |
Одномерные индексаторы...................................................................................................... |
41 |
Многомерные индексаторы.................................................................................................... |
44 |
Перегрузка методов..................................................................................................................... |
45 |
Перегрузка знаков операций...................................................................................................... |
47 |
Наследование............................................................................................................................... |
54 |
Виртуальные функции................................................................................................................ |
60 |
Работа с файлами......................................................................................................................... |
65 |
Работа с каталогами ................................................................................................................ |
71 |
Абстрактный класс FileSystemInfo .................................................................................... |
71 |
Класс DirectoryInfo .............................................................................................................. |
72 |
Сериализация....................................................................................................................... |
74 |
FileSystemWatcher – отслеживание событий, связанных с файлами.................................. |
77 |
Обобщения (шаблоны)................................................................................................................ |
78 |
Интерфейсы.................................................................................................................................. |
83 |
Коллекции.................................................................................................................................... |
88 |
Словари..................................................................................................................................... |
92 |
Инициализаторы коллекций................................................................................................... |
95 |
Итераторы................................................................................................................................. |
95 |
LINQ.............................................................................................................................................. |
97 |
Грамматика выражений запросов........................................................................................ |
100 |
Синтаксис запросов................................................................................................................... |
101 |
Проекция и фильтрация........................................................................................................ |
101 |
Упорядочение ........................................................................................................................ |
104 |
Агрегирующие запросы........................................................................................................ |
105 |
Операции с коллекциями.......................................................................................................... |
106 |
Операция Concat .................................................................................................................... |
106 |
Операция Union ..................................................................................................................... |
106 |
Преобразование ..................................................................................................................... |
106 |
Объединение последовательностей..................................................................................... |
109 |
FirstOrDefault.......................................................................................................................... |
109 |
Группировка........................................................................................................................... |
110 |
Делегаты..................................................................................................................................... |
112 |
Групповая адресация......................................................................................................... |
115 |
Анонимные методы и лямбда-выражения.......................................................................... |
118 |
Обработка событий ............................................................................................................... |
120 |
Групповое преобразование делегируемых методов....................................................... |
127 |
Применение методов экземпляра в качестве делегатов................................................ |
127 |
Групповая адресация......................................................................................................... |
129 |
Чернов Э. А. |
- 3 - |
Лекции по языку C# v 2.3 |
Ковариантность и контравариантность........................................................................... |
131 |
Класс System. Delegate ...................................................................................................... |
133 |
Назначение делегатов........................................................................................................ |
133 |
Анонимные функции......................................................................................................... |
133 |
Анонимные методы........................................................................................................... |
134 |
Передача аргументов анонимному методу..................................................................... |
134 |
Возврат значения из анонимного метода........................................................................ |
135 |
Применение внешних переменных в анонимных методах ........................................... |
136 |
Лямбда-выражения............................................................................................................ |
138 |
Лямбда-оператор ............................................................................................................... |
138 |
Одиночные лямбда-выражения........................................................................................ |
138 |
Блочные лямбда-выражения............................................................................................. |
141 |
События.............................................................................................................................. |
143 |
Пример групповой адресации события........................................................................... |
145 |
Методы экземпляра в сравнении со статическими методами в качестве.................... |
146 |
Применение аксессоров событий..................................................................................... |
148 |
Разнообразные возможности событий............................................................................ |
153 |
Применение анонимных методов и лямбда-выражений вместе с событиями............ |
153 |
Рекомендации по обработке событий в среде .NET Framework ................................... |
154 |
Применение делегатов EventHandler<TEventArgs> и EventHandler............................. |
156 |
Практический пример обработки событий..................................................................... |
157 |
Чернов Э. А. |
- 4 - |
Лекции по языку C# v 2.3 |
Литература
1.Лекции Саратовского университета по языку C#.
2.Троелсен Э. Язык программирования C# 2010 и платформа .NET4 2010.
3.Шилдт Г. Полное руководство C# 4.0.
Введение
Язык C# является продолжением развития языка С++. Схематически это можно представить так:
Строго формализованный язык для разработки приложений пользователя и операционных систем
Добавление к языку С парадигмы объектно-ориентированного программирования
Добавление к языку С++ сборок CLR и управляемого кода
Добавление к языку C# языка XAML и привязки данных
Использование языка C# совместно с базами данных.
Шаблоны приложений
IDE Integrated Development Environment
GUI Graphics User Interface
ADO ActiveX Data Objects
CLR Common Language Run Time
XAML Extended Markup Language
WPF Windows Presentation Foundation
EF Entity Framework
EDM Entity Data Model
В связи с развитием Интернета изменен принцип выполнение кода программы приложения. Языки С и С++ - это языки компилируемого типа. Компилятор преобразует исходный код программы в текст на языке ассемблер, подключает из библиотек все требуемые модули и формирует исполняемый файл с расширением
.exe, готовый для запуска на выполнение. Такая схема обработки затрудняет ком-
Чернов Э. А. |
- 5 - |
Лекции по языку C# v 2.3 |
поновку приложения из модулей, написанных на разных языках программирования, а использование указателей делает программу не безопасной для компьютера.
Программа, реализованная на управляемом коде, обрабатывается в два этапа. На первом этапе текст программы преобразуется в так называемый «управляемый код». Запустить обычным способом на выполнение такой код нельзя. Но при запуске на сервере управляемый код обрабатывается транслятором интерпретирующего типа, который обрабатывает по одной каждую строку управляемого кода. Такая обработка исключает применение указателей, обеспечивая безопасность, и позволяет собирать в единое целое, транслированное с разных языков программирования приложение из фрагментов, для которых требование только одно: формат управляемого кода должен быть одинаковым.
Именно сборки (CLR) предоставляют возможность собирать приложение из фрагментов, написанных на разных языках.
Трудно представить приложение, работающее без обращения к базе данных. По этой причине одна и та же информация обычно существует в нескольких местах.
Работа приложения с базами данных состоит из двух фаз:
Обращение к базе данных из приложения для получения или сохранения данных.
Работа с данными в приложении для просмотра и/или корректировки данных.
Данные, поступившие из одной базы данных в оперативную память приложения, концентрируются в одном компоненте, чтобы упростить обмен информацией с базой данных и исключить ее утерю. Этот компонент является объектом класса DataSet.
Приложение не обрабатывает напрямую данные, отображаемые на экране. Изменения вносятся в составные элементы объекта класса DataSet, и уже эти изменения отображаются на экране. Такой метод обработки информации называется «Работой с отсоединенным набором данных».
Ниже представлена схема работы с «отсоединенным» набором данных.
Объект класса DataSet размещается в оперативной памяти приложения и состоит из одной или нескольких таблиц, адаптеров для их обработки и объектов, обеспечивающих связи между таблицами. Все перечисленные составляющие представляются объектами соответствующих классов.
Из базы данных информация поступает в оперативную память (набор данных DataSet), и таблицы из этого набора данных отображаются на экране. Такая схема обработки сокращает количество обращений к базе данных, но создает трудности отслеживания идентичности информации во всех источниках. Кроме того, операции по связи с базой данных рутинны, и нет смысла оформлять код программы для их реализации в каждом приложении снова.
Чернов Э. А. |
- 6 - |
Лекции по языку C# v 2.3 |
Изложенные соображения привели к появлению концепции «привязки» данных, которая решает следующие задачи:
1.Извлечение данных из базы данных в набор данных DataSet.
2.Отображение данных на экране
3.Накопление данных корректировки
4.Синхронное обновление данных (при изменении информации в одном месте одновременно обновление в другом месте).
5.Сохранение в базе данных после корректировки
Схематически привязка представлена на рисунке ниже. Чаще всего реализуется двухсто-
ронняя привязка, при которой изменение информации в одном месте автоматически выполняет ее корректировку в другом месте. Но в среде WPF можно реализовать и односторонние привязки.
В настоящее время на базе EDM применяются шаблоны разработки приложений (MVC, MPV и MVVM). Ниже представлен схема шаблона MVC (Model View Controller) – Модель – Представление - Контроллер.
(Рисунок из Википедии)
В этом шаблоне взаимодействие системы с пользователем разделено на три отдельных функциональных блока. Между собой блоки относительно независимы. Для обеспечения независимости разработана концепция оповещений и подписки. Модель выдает оповещение о выполненных изменениях, а пользователи «подписываются» на получение оповещений, которые к ним относятся. Поэтому с одной и той же информационной моделью могут одновременно работать несколько пользователей.
Этот шаблон является заготовкой, которая заполняется конкретными данными и модулями для разрабатываемого приложения.
Смысл разработки таких шаблонов сводится к тому, чтобы отделить функциональные и информационные составляющие (Модель) от представления информации на
Чернов Э. А. |
- 7 - |
Лекции по языку C# v 2.3 |
экране (Представление). Связь Модели с Представлением выполняет Контроллер, который реагирует на действия пользователя и реализует коррекцию, как модели, так и представления.
Сравнение языков С++ и C#
В языке C# добавлено несколько новых типов данных, но они применяются не часто, поэтому в обычных разработках их можно не учитывать (например, финансовый тип – это число, которое может содержать до 28 знаков с фиксированным положением десятичной точки).
На уровне арифметических и логических выражений операторы языков С++ и C# практически одинаковы.
Объявления переменных, массивов и классов имеют отличия. Объявление скалярных переменных не отличается от объявлений в языке С++:
double a, b = 2, c; |
// Объявление переменных |
Вместе с объявлением можно выполнять инициализацию.
Можно приписать атрибут const, обеспечивающий защиту переменной от случайного изменения. Например,
const int n = 5;// Объявление целочисленной константы n
Объявление одномерных массивов имеет приведенную ниже форму
int [ ]n = new int[5]; |
// Без инициализации |
int [ ]n = {7, 1, 2, 3, 8}; |
// С инициализацией |
Примечание: Массив, объявленный без инициализации, автоматически обнуляется. Объявление многомерных массивов в языке C# отличается от объявлений на языке С++.
int [,] a= new int [2, 3]; |
// Массив из двух строк и трех столбцов |
int [,] a={{7, 1, 2}, {8, 4, 5}}; |
// Тот же массив, но с инициализацией |
Обратите внимание – на количество измерений указывает запятая, в квадратных скобках. При инициализации двухмерных массивов каждая строка значений записывается в своей паре фигурных скобок.
Любая объявленная в языке C# переменная типа массива является объектом класса Array. Это класс имеет ряд функций, которые могут быть полезны при работе с массивами. Для обращения к членам этого класса после имени объявленного массива ставят точку, после которой вставляют требуемую функцию. Для некоторых из этих функций после имени просто ставят пару круглых скобок (свойства), а для других записывают параметр в круглых скобках (статические методы).
Ниже перечислены основные функции.
Элемент |
Тип |
Назначение |
|
Length |
свойство |
Количество элементов массива (по всем размерно- |
|
|
|
стям) |
|
|
статиче- |
Присваивание элементам массива значений по |
|
Clear |
ский ме- |
||
умолчанию |
|||
|
тод |
||
|
Копирование заданного диапазона элементов одно- |
||
Copy |
статиче- |
||
ский ме- |
го массива в другой |
||
|
Чернов Э. А.
Элемент |
Тип |
|
тод |
|
статиче- |
CopyTo |
ский ме- |
|
тод |
GetValue |
экземпляр |
IndexOf |
экземпляр |
|
|
|
статиче- |
LastIndexOf |
ский ме- |
|
тод |
Reverse |
статиче- |
ский ме- |
|
|
тод |
|
статиче- |
SetValue |
ский ме- |
|
тод |
Sort |
экземпляр |
- 8 - |
Лекции по языку C# v 2.3 |
|
Назначение |
Копирование всех элементов текущего одномерного массива в другой массив
Получение значения элемента массива Поиск первого вхождения элемента в одномерный массив
Поиск последнего вхождения элемента в одномерный массив
Изменение порядка следования элементов на обратный
Установка значения элемента массива
Упорядочивание элементов одномерного массива
Например, при выполнении приведенных ниже операторов будет выведено 4:
int [ ] ar = { 2, 3, 1, 4}; int len = ar.Length;
Кроме стандартных операторов цикла while, do-while и for (синтаксис которых не отличается от аналогичных операторов языка С++) в язык C# добавлен оператор цикла foreach, который применяется для перебора элементов в массивах и коллекциях. Этот оператор удобен тем, что он автоматически определяет количество элементов в рассматриваемом объекте и строит цикл, для которого не требуется специально объявлять переменную цикла (для обращения к индексам элементов). Это удобно при запросах в базу данных, когда неизвестно, сколько переменных будет извлечено в результате выполнения операции. При применении оператора foreach необходимо объявлять переменную, тип которой совпадает с типом элементов обрабатываемого массива (если элементом коллекции является класс, то требуется объявлять объект этого класса). В эту переменную заносится текущее значение из перебираемого списка. Например, пусть объявлен массив типа double.
double [ ] a = {1.0, 2.1, 3.5, 4.7, 5.2 };
Тогда для перебора элементов этого массива оператор будет иметь вид: foreach (double x in a)
Переменная х будет поочередно получать значения из массива а, переменная для обозначения индексов отсутствует, а количество элементов определяется автоматически.
В языке C# существуют ступенчатые массивы (в языке С++ такие массивы называются массивами указателей).
Ступенчатый массив объявляется в виде одномерного массива первого уровня, каждый элемент которого ссылается на соответствующий ему одномерный массив. Таким образом получается двухмерный массив. Для реализации такой конструкции требуется выделять память для каждого из одномерных массивов второго уровня.