ebook img

Лекции по языку Visual С# PDF

159 Pages·1.466 MB·Russian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Лекции по языку Visual С#

МОСКОВСКИЙ АВТОМОБИЛЬНО-ДОРОЖНЫЙ ГОСУ- ДАРСТВЕННЫЙ УНИВЕРСИТЕТ (МАДИ) Чернов Э. А. Лекции по языку 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 размещается в оперативной памяти приложения и состоит из од- ной или нескольких таблиц, адаптеров для их обработки и объектов, обеспечивающих связи между таблицами. Все перечисленные составляющие представляются объектами соответствующих классов. Из базы данных информация поступает в оперативную память (набор данных Data- Set), и таблицы из этого набора данных отображаются на экране. Такая схема обра- ботки сокращает количество обращений к базе данных, но создает трудности от- слеживания идентичности информации во всех источниках. Кроме того, операции по связи с базой данных рутинны, и нет смысла оформлять код программы для их реализации в каждом приложении снова. Чернов Э. А. - 6 - Лекции по языку C# v 2.3 Изложенные соображения привели к появлению концепции «привязки» данных, которая решает следующие задачи: 1. Извлечение данных из базы данных в набор данных DataSet. 2. Отображение данных на экране 3. Накопление данных корректировки 4. Синхронное обновление данных (при изменении информации в одном месте од- новременно обновление в другом месте). 5. Сохранение в базе данных после корректировки Схематически привязка представлена на рисунке ниже. Чаще всего реализуется двухсто- ронняя привязка, при которой изменение информации в одном месте автоматически выполняет ее корректировку в другом месте. Но в среде WPF можно реализовать и односторонние привязки. В настоящее время на базе EDM применяются шаблоны разработки приложений (MVC, MPV и MVVM). Ниже представлен схема шаблона MVC (Model View Con- troller) – Модель – Представление - Контроллер. (Рисунок из Википедии) В этом шаблоне взаимодействие системы с пользователем разделено на три от- дельных функциональных блока. Между собой блоки относительно независимы. Для обеспечения независимости разработана концепция оповещений и подписки. Модель выдает оповещение о выполненных изменениях, а пользователи «подпи- сываются» на получение оповещений, которые к ним относятся. Поэтому с одной и той же информационной моделью могут одновременно работать несколько пользо- вателей. Этот шаблон является заготовкой, которая заполняется конкретными данными и модулями для разрабатываемого приложения. Смысл разработки таких шаблонов сводится к тому, чтобы отделить функциональ- ные и информационные составляющие (Модель) от представления информации на Чернов Э. А. - 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 ский ме- го массива в другой Чернов Э. А. - 8 - Лекции по языку C# v 2.3 Элемент Тип Назначение тод статиче- Копирование всех элементов текущего одномерного CopyTo ский ме- массива в другой массив тод GetValue экземпляр Получение значения элемента массива Поиск первого вхождения элемента в одномерный IndexOf экземпляр массив статиче- Поиск последнего вхождения элемента в одномер- LastIndexOf ский ме- ный массив тод статиче- Изменение порядка следования элементов на обрат- Reverse ский ме- ный тод статиче- SetValue ский ме- Установка значения элемента массива тод Sort экземпляр Упорядочивание элементов одномерного массива Например, при выполнении приведенных ниже операторов будет выведено 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# существуют ступенчатые массивы (в языке С++ такие массивы назы- ваются массивами указателей). Ступенчатый массив объявляется в виде одномерного массива первого уровня, ка- ждый элемент которого ссылается на соответствующий ему одномерный массив. Таким образом получается двухмерный массив. Для реализации такой конструкции требуется выделять память для каждого из одномерных массивов второго уровня. Чернов Э. А. - 9 - Лекции по языку C# v 2.3 Поскольку для каждого из массивов второго уровня память выделяется отдельно, то и их размерность (длина) может быть разной. Например: int [ ][ ] a = new int [3][ ]; // Объявление массива из 3 строк первого уровня a[0]=new int [3]; // Для строки 0 ссылка на строку из 3 элементов a[1]=new int [6]; // Для строки 1 ссылка на строку из 6 элементов a[2]=new int [4]; // Для строки 2 ссылка на строку из 4 элементов Этот же ступенчатый массив можно объявить и так: int [ ][ ] a= {new int [3], new int [6], new int [4]}; Примечание: Ступенчатые массивы можно только читать. После создания массива его элементы изменить нельзя, поскольку может возникать ошибка на стадии вы- полнения программы. Ниже приведена программа, выводящая коэффициенты би- нома Ньютона для первых 4 степеней. Количество строк при объявлении ступенча- того массива указывается обязательно, а длину каждой строки, если она инициали- зируется, можно не указывать. static void Main(string[] args) { // Коэффициенты бинома Ньютона int [ ][ ] a = new int[4][ ]; // Объявление массива из 4 строк первого уровня a[0] = new int[ ] {1}; // Для строки 0 ссылка на строку из 1 элемента a[1] = new int[ ] {1, 2, 1}; // Для строки 1 ссылка на строку из 3 элементов a[2] = new int[ ] {1,3, 3,1};// Для строки 2 ссылка на строку из 4 элементов a[3] = new int[ ] {1,4,6,4,1};// Для строки 3 ссылка на строку из 5 элементов for (int i = 0; i < a.Length; i++) // Внешний цикл { foreach (int x in a[i]) { Console.Write("{0} ", x); // Печать текущей ст роки } Console.WriteLine(); // Перевод на новую строку } Console.ReadKey(); } Результат выполнения программы: Обратите внимание: внешний цикл запускается для заданного количества элемен- тов, а внутренний цикл (реализованный с помощью оператора foreach) для каждой последующей строки обрабатывает разное количество элементов. Логические выражения Существуют задачи, при решении которых появляются величины, принимающие только одно из двух возможных значений. Одно из этих состояний принимается за «истинное», а другое за «ложное». Для этих величин не может быть задано никакое третье значение (естественно, процесс переключения такой величины из одного со- стояния в другое не рассматривается), например, лампочка может быть включена или выключена. Обычно логические величины появляются при проверке логиче- ских отношений. Чернов Э. А. - 10 - Лекции по языку C# v 2.3 Логические величины входят в состав логических выражений, используемых в опе- раторах управления программой (операторах условного перехода, операторах цик- ла и т.д.). Логические выражения состоят из арифметических выражений, логиче- ских отношений и логических операций. В языке C# определены следующие операции логических отношений: > строго больше; < строго меньше; >= больше или равно; <= меньше или равно; != не равно; == сравнение на равенство; Перечисленные знаки логических отношений часто соединяют арифметические выражения. Приоритет арифметических операций выше операций сравнения. По- этому при проверке логического отношения, сначала выполняется вычисление арифметических выражений (чтобы с обеих сторон от знака логического отноше- ния были получены конкретные числа), а после этого выполняется сравнение. Ни- же приведены примеры записи логических отношений: x < 0.5 a + 1 >= b/2 - 1 c != 'S' В результате проверки логических отношений формируются значения истинности и ложности. Помимо числовых величин в логических отношениях могут участвовать символы и строки. В этом случае символы сравниваются по своим числовым кодам в соответ- ствие с кодовой таблицей. Аналогично строки сравнивают по кодам символов сле- ва направо до первого, не совпадающего по коду символа, который и определяет, какая из строк больше (или меньше). В языке C# существует тип данных bool, позволяющий объявлять переменные ло- гического типа, которые могут принимать значения true (истинно) и false (ложно). Кроме операций логических отношений в логических выражениях могут использо- ваться логические операции. Определены следующие логические операции: Логическая операция Название Обозначение Отрицание NOT (Не) ! Логическое сложение OR (ИЛИ) || Логическое умножение AND (И) && Исключительное ИЛИ (двуместная операция) XOR ^ Исключительное ИЛИ (одноместная операция) XOR ~ Поразрядное Логическое сложение OR (ИЛИ) | Поразрядное Логическое умножение AND (И) & Результаты выполнения логических операций наглядно можно представить в виде таблиц истинности. В этих таблицах A и B операнды, а R - результат выполнения операции. Следует отметить, что название логических операций соответствует их смыслу в разговорном языке (как русском, так и английском).

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.