Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование
Скачать 5.54 Mb.
|
Васильев А.Н. ПРОГРАММИРОВАНИЕ НА РОССИЙСКИЙ КОМПЬЮТЕРНЫЙ БЕСТСЕЛЛЕР Москва 2019 ОСОБЕННОСТИ ЯЗЫКА ƣƔƚ 004.43 ƑƑƚ 32.973.26-018.1 ƒ 19 ƗƵdžƽǀǑƺƷ , ƕǀƺƿdžƺƾ ƢƽƿǃǀƵƺƷƽnj. ƟǀƾƳǀưƼƼƸǀƾƲưƽƸƵ ƽư C# ƴƻǏ ƽưLJƸƽưǎljƸDž. ƞǁƾƱƵƽƽƾǁǂƸ ǏƷNjƺư / ƐƻƵƺǁƵƹ ƒưǁƸƻnjƵƲ. — ƜƾǁƺƲư : ƭƺǁƼƾ, 2019. — 528 ǁ. — (ƠƾǁǁƸƹǁƺƸƹ ƺƾƼƿnjǎǂƵǀƽNjƹ ƱƵǁǂǁƵƻƻƵǀ). ISBN 978-5-04-092520-9 ƒǂƾǀưǏ ƺƽƸƳư ƸƷƲƵǁǂƽƾƳƾ ǀƾǁǁƸƹǁƺƾƳƾ ưƲǂƾǀư ǁưƼƾǃLJƸǂƵƻƵƹ ƿƾ ƿǀƾƳǀưƼ- ƼƸǀƾƲưƽƸǎ , ƿƾǁƲǏljƵƽƽưǏ ƾǁƾƱƵƽƽƾǁǂǏƼ ǏƷNjƺư C# Ƹ ƵƳƾ ƿǀưƺǂƸLJƵǁƺƾƼǃ ƿǀƸ- ƼƵƽƵƽƸǎ . ƘƷ Ǎǂƾƹ ƺƽƸƳƸ ƲNj ǃƷƽưƵǂƵ, ƺưƺƸƵ ƾǁƽƾƲƽNjƵ ǁǂǀǃƺǂǃǀƽNjƵ ƵƴƸƽƸdžNj ǏƷNjƺư ǁǃljƵǁǂƲǃǎǂ, ƽưǃLJƸǂƵǁnj ƿƸǁưǂnj ƿǀƾƳǀưƼƼNj, ƸǁƿƾƻnjƷǃǏ ƲǁƵ ƾǁƽƾƲƽNjƵ ƼƵǂƾƴNj Ƹ ƸƽǂƵǀDŽƵƹǁNj, Ƹ ƾƲƻưƴƵƵǂƵ ƾƴƽƸƼ ƸƷ ǁưƼNjDž ƲƾǁǂǀƵƱƾƲưƽƽNjDž Ƹ ƿƾƿǃ- ƻǏǀƽNjDž ǏƷNjƺƾƲ ǁƵƼƵƹǁǂƲư C. ƨƙƟ 004.43 ƖƖƟ 32.973.26-018.1 ƒ 19 ISBN 978-5-04-092520-9 © ƗƵdžƽǀǑƺƷ ƕ.Ƣ., LJƺƿdžLJ, 2018 © ƣljǃDžǁǀƺǂƽƺ. ƣƣƣ «ƝƼƹƵLJƺǀǑdžLJƷǃ «Ʋƿdžǁǃ», 2019 3 ОГЛАВЛЕНИЕ Введение. Расширенные возможности C# . . . . . . . . . . . . . . . . . . . . О чем пойдет речь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Необходимые навыки и ресурсы . . . . . . . . . . . . . . . . . . . . . . . . Обратная связь с автором . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 1. Абстрактные классы и интерфейсы . . . . . . . . . . . . . . . . . . . Знакомство с абстрактными классами . . . . . . . . . . . . . . . . . . . . Использование абстрактных классов . . . . . . . . . . . . . . . . . . . . Знакомство с интерфейсами . . . . . . . . . . . . . . . . . . . . . . . . . . Наследование интерфейсов . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейсные переменные . . . . . . . . . . . . . . . . . . . . . . . . . . Явная реализация членов интерфейса . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . . Глава 2. Делегаты и события . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с делегатами . . . . . . . . . . . . . . . . . . . . . . . . . . . . Многократная адресация . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование делегатов . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с анонимными методами . . . . . . . . . . . . . . . . . . . . Использование анонимных методов . . . . . . . . . . . . . . . . . . . . . 93 Лямбда-выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с событиями . . . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Глава 3. Перечисления и структуры . . . . . . . . . . . . . . . . . . . . . . Знакомство с перечислениями . . . . . . . . . . . . . . . . . . . . . . . Знакомство со структурами . . . . . . . . . . . . . . . . . . . . . . . . . Массив как поле структуры . . . . . . . . . . . . . . . . . . . . . . . . . Массив экземпляров структуры . . . . . . . . . . . . . . . . . . . . . . Структуры и метод ToString() . . . . . . . . . . . . . . . . . . . . . Свойства и индексаторы в структурах . . . . . . . . . . . . . . . . . . Экземпляр структуры как аргумент метода . . . . . . . . . . . . . . . Экземпляр структуры как результат метода . . . . . . . . . . . . . . . Операторные методы в структурах . . . . . . . . . . . . . . . . . . . . Структуры и события . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Структуры и интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . 175 Оглавление 4 Глава 4. Указатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с указателями . . . . . . . . . . . . . . . . . . . . . . . . . . Адресная арифметика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Указатели на экземпляр структуры . . . . . . . . . . . . . . . . . . . . Инструкция xed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Указатели и массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Указатели и текст . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Многоуровневая адресация . . . . . . . . . . . . . . . . . . . . . . . . . Массив указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Глава 5. Обработка исключений . . . . . . . . . . . . . . . . . . . . . . . . . Принципы обработки исключений . . . . . . . . . . . . . . . . . . . . Использование конструкции try-catch . . . . . . . . . . . . . . . . Основные классы исключений . . . . . . . . . . . . . . . . . . . . . . . Использование нескольких блоков . . . . . . . . . . . . . . . Вложенные конструкции try-catch и блок nally . . . . . . . . Генерирование исключений . . . . . . . . . . . . . . . . . . . . . . . . . Пользовательские классы исключений . . . . . . . . . . . . . . . . . . Инструкции checked и unchecked . . . . . . . . . . . . . . . . . . . Использование исключений . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Глава 6. Многопоточное программирование . . . . . . . . . . . . . . . . . Класс Thread и создание потоков . . . . . . . . . . . . . . . . . . . . . Использование потоков . . . . . . . . . . . . . . . . . . . . . . . . . . . Фоновые потоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Операции с потоками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Синхронизация потоков . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование потоков . . . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Глава 7. Обобщенные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . Передача типа данных в виде параметра . . . . . . . . . . . . . . . . . Обобщенные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обобщенные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обобщенные структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . Обобщенные интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . Обобщенные классы и наследование . . . . . . . . . . . . . . . . . . . Обобщенные делегаты . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ограничения на параметры типа . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . 378 Оглавление Глава 8. Приложения с графическим интерфейсом . . . . . . . . . . . . . Принципы создания графического интерфейса . . . . . . . . . . . . Создание пустого окна . . . . . . . . . . . . . . . . . . . . . . . . . . . . Окно и обработка событий . . . . . . . . . . . . . . . . . . . . . . . . . . Кнопки и метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование списков . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование переключателей . . . . . . . . . . . . . . . . . . . . . . Опция и поле ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Меню и панель инструментов . . . . . . . . . . . . . . . . . . . . . . . . Контекстное меню . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Координаты курсора мыши . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Глава 9. Немного о разном . . . . . . . . . . . . . . . . . . . . . . . . . . . . Работа с диалоговым окном . . . . . . . . . . . . . . . . . . . . . . . . . Использование пространства имен . . . . . . . . . . . . . . . . . . . . Работа с датой и временем . . . . . . . . . . . . . . . . . . . . . . . . . . Работа с файлами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с коллекциями . . . . . . . . . . . . . . . . . . . . . . . . . Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Задания для самостоятельной работы . . . . . . . . . . . . . . . . . . Заключение. Итоги и перспективы . . . . . . . . . . . . . . . . . . . . . . . Предметный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 6 Введение РАСШИРЕННЫЕ ВОЗМОЖНОСТИ Я мечтал об этом всю свою сознательную жизнь. из к/ф Ирония судьбы или с легким паром» Вниманию читателя предлагается вторая часть книги о языке программирования. Впервой части книги рассмотрены базовые синтаксические конструкции языка, основные типы данных, управляющие инструкции (условный оператор, оператор выбора, операторы цикла) и массивы. Также в ней описывались способы создания классов и объектов, методы их использования. Еще впервой части состоялось знакомство с индек- саторами и свойствами, операторными методами. Наследование, перегрузка и переопределение методов также относятся к первой части книги. Предполагается, что читатель знаком (хотя бы на начальном уровне) с этими темами. В противном случае, перед изучением материала из второй части книги, следует освежить в памяти материал из первой части или обратиться к другому аналогичному учебному пособию). О чем пойдет речь Я бы на вашем месте за докторскую диссертацию немедленно сел. из к/ф Иван Васильевич меняет профессию» Далее мы рассмотрим различные темы, связанные с наиболее актуальными и перспективными механизмами языка C#: • Сначала мы познакомимся с абстрактными классами. Узнаем, в чем особенность абстрактных классов, зачем они нужны и как используются Мы рассмотрим способы создания и использования интерфейсов Расширенные возможности C# 7 • Важные механизмы связаны с использованием делегатов. Мы узнаем, как объявляются делегаты, как на их основе создаются экземпляры и какую роль при этом играют ссылки на методы. Также состоится знакомство с анонимными методами и лямбда-выражениями. • Кроме полей, методов, свойств и индексаторов, в классах могут быть такие члены, как события. Зачем они нужны и как используются, описывается в этой книге Мы познакомимся с перечислениями — специальными типами, возможный диапазон значений которых определяется набором констант Кроме классов, в языке C# широко используются структуры. Работе со структурами в книге уделяется отдельное внимание Мощный механизм, связанный с выполнением операций с памятью, базируется на использовании указателей. Мы рассмотрим и эту тему Отдельная глава посвящена перехвату и обработке исключений ошибок, которые возникают в процессе выполнения программы Язык C# имеет средства поддержки многопоточного программирования, позволяющие одновремено выполняться нескольким частям программы. Способы создания многопоточных приложений описываются в этой книге Обобщенные типы — элегантный механизм, позволяющий создавать красивый и эффективный программный код. Данной теме в книге уделено достаточно внимания Одна из глав книги посвящена вопросам создания приложений с графическим интерфейсом Также у нас состоится краткое знакомство с коллекциями, а еще мы научимся выполнять различные операции с файлами. Будет и кое-что еще Введение Необходимые навыки и ресурсы Наконец-то все закончится. И я смогу спокойно поиграть в шахматы. И вообще, пора на пенсию. из к/ф Гостья из будущего» Если читатель предварительно ознакомился с содержанием первой части этой книги, то полученных знаний и навыков будет вполне достаточно для того, чтобы разобраться с представленным далее материалом. Вообще же для успешной и эффективной работы со второй частью книги нужно иметь представление о структуре программы в языке C#, базовых типах данных, операторах и управляющих инструкциях. Понадобятся знания в плане создания и использования массивов, описания классов и создания на их основе объектов. Мы будем использовать свойства и индексаторы, операторные методы, прибегать к наследованию, перегрузке и переопределению методов. Предполагается, что читатель знаком со способами создания приложений на языке C# и обладает необходимыми навыками для работы со средой разработки. В качестве последней предлагается использовать приложение (или некоммерческую версию Microsoft Visual Studio Express). Примеры из книги тестировались именно в этой среде разработки. Минимальная, но вполне достаточная для успешной работы информация о среде разработки есть впервой части книги. В этой, второй части в некоторых случаях (когда в этом есть необходимость) также даются пояснения по поводу особенностей работы со средой разработки. Обратная связь с автором Автор книги — Васильев Алексей Николаевич, доктор физико-матема- тических наук, профессор кафедры теоретической физики физического факультета Киевского национального университета имени Тараса Шевченко. Информацию об этой и других книгах автора можно найти на сайте www.vasilev.kiev.ua. Вопросы, замечания и предложения можно отправлять автору по адресу электронной почты alex@vasilev.kiev.ua Глава АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ Мерзавец, а, мерзавец, ты, значит, здесь вместо работы латынь изучаешь? из к/ф Формула любви» В этой главе мы в некотором смысле продолжим тему наследования, рассмотренную впервой части книги. Но сейчас речь пойдет скорее о сопутствующих технологиях. Нам предстоит познакомиться с абстрактными классами и интерфейсами. Мы узнаем что такое абстрактный класс и зачем он нужен что такое интерфейс, как он описывается и как используется в чем особенность интерфейсных переменных как реализуется расширение интерфейсов что такое явная реализация интерфейса ив чем ее специфика. Также мы рассмотрим дополнительные аспекты, имеющие отношение к использованию абстрактных классов и интерфейсов. Знакомство с абстрактными классами Астронавты Которая тут цаппа? — Там. ржавая гайка, родной. из к/ф «Кин-дза-дза» Есть такое понятие, как абстрактный метод. Абстрактным называется метод, который в классе только объявлен, ноне описан. Под объявлением метода подразумевается ситуация, когда в теле класса указан тип результата метода, его название и приведен список аргументов (после Глава закрывающей круглой скобки ставится точка с запятой, а тела метода нет. То есть блока из фигурных скобок с командами, выполняемыми при вызове метода, нет вообще. Но чтобы метод был абстрактным, недостаточно описать его без тела с командами. В описании метода необходимо явно указать, что метод абстрактный. Для этого используется ключевое слово abstract. Шаблон описания абстрактного метода представлен ниже (жирным шрифтом выделены ключевые элементы шаблона abstract ɬɢɩ Сначала указывается спецификатор уровня доступа, затем ключевое слово abstract, после него — идентификатор типа результат метода, название и список аргументов. При этом аргументы описываются, как ив обычном (не абстрактном) методе, с указанием типа аргумента и его формального названия. В конце ставится точка с запятой. Если в классе есть хотя бы один абстрактный метод, то такой класс также считается абстрактным. Абстрактный класс, как и абстрактный метод, описывается с ключевым словом Поскольку у абстрактного метода нет тела и неизвестно, какие команды должны выполняться при вызове метода, то такой метод вызвать нельзя. Поэтому, как вы могли догадаться, на основе абстрактного класса нельзя создать объект. В этом случае все логично если бы такой объект можно было создать, то у него был бы метод, который нельзя вызвать. А это, как минимум, странно и непоследовательно. Но тогда возникает вопроса зачем вообще нужны абстрактные классы Ответ состоит в том, что абстрактный класс может (и должен) использоваться как базовый при наследовании. Это его главное и наиболее важное назначение — быть базовым классом. Общая схема такова создается абстрактный класса затем путем наследования на основе абстрактного класса создаются обычные (не абстрактные) производные классы. При этом в производных классах абстрактные методы переопределяются описывается полная версия метода, и, как при переопределении обычных методов, в описании указывается ключевое слово override . В производном классе должны быть переопределены (описаны) все абстрактные методы из абстрактного базового класса НАЗ А МЕТКУ Абстрактный метод по определению является виртуальным. При этом ключевое слово virtual в объявлении абстрактного метода не используется. Также следует учитывать, что абстрактный метод не может быть статическим Абстрактные классы и интерфейсы 11 Преимущество использования абстрактного класса как базового состоит в том, что, описывая базовый класс, мы фактически создаем некий шаблон для производных классов. Все производные классы, созданные на основе одного итого же абстрактного класса, будут иметь определенный набор методов. В каждом из классов эти методы реализуются по-своему, но они есть, и мы в этом можем быть уверены. Конечно, никто не запрещает нам описать обычный (не абстрактный) класс и затем на его основе создавать производные классы, переопределяя в них методы их базового класса. Но это не самый лучший подход, поскольку если забыть переопределить в производном классе метод (который надо переопределить, тов производном классе будет использована унаследованная версия метода из базового класса и формальной ошибки в этом не будет. А такие ситуации сложно отслеживать. Делая же методы абстрактными в базовом абстрактном классе, мыс необходимостью должны будем описать их в производном классе. Если этого не сделать, программа просто не скомпилируется. q ПОДРОБНОСТИ bЕсли класс описать с ключевым словом abstract , то он будет абстрактным, даже если в классе нет ни одного абстрактного метода. При наследовании абстрактного класса в производном классе можно переопределять не все абстрактные методы из базового класса. Нов таком случае производный класс также будет абстрактными должен быть описан с ключевым словом Также следует заметить, что хотя создать объект абстрактного класса нельзя, но можно объявить объектную переменную для абстрактного класса. Эта переменная не может ссылаться на объект абстрактного класса (поскольку такой объект создать нельзя, зато она может ссылаться на объект производного класса. А поскольку абстрактные методы по умолчанию являются виртуальными и переопределяются в производном классе, то через объектную переменную базового абстрактного класса будут вызываться именно те версии методов, что определены в производном классе. Далее перейдем к рассмотрению примеров ПОДРОБНОСТИ bАбстрактными могут быть также свойства и индексаторы. При описании абстрактного свойства или индексатора используется ключевое слово abstract . В теле свойства или метода аксессоры Глава не описываются. Указываются только ключевые слова get и set или только одно из них, если у свойства или индексатора только один аксессор. В производном классе свойство или индексатор описываются с ключевым словом override , как при переопределении метода. При этом должны быть описаны все аксессоры, объявленные в абстрактном классе для данного свойства или индексатора. |