Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ООП (язык C#).pdf
Скачиваний:
180
Добавлен:
16.05.2015
Размер:
1.54 Mб
Скачать

МОСКОВСКИЙ АВТОМОБИЛЬНО-ДОРОЖНЫЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

(МАДИ)

Чернов Э. А.

Лекции по языку 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# существуют ступенчатые массивы (в языке С++ такие массивы называются массивами указателей).

Ступенчатый массив объявляется в виде одномерного массива первого уровня, каждый элемент которого ссылается на соответствующий ему одномерный массив. Таким образом получается двухмерный массив. Для реализации такой конструкции требуется выделять память для каждого из одномерных массивов второго уровня.