Язык С#. Базовый курс
Покупка
Тематика:
Программирование на C и C++
Издательство:
Финансы и статистика
Автор:
Подбельский Вадим Валериевич
Год издания: 2022
Кол-во страниц: 408
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-00184-079-4
Артикул: 146350.03.99
Доступно для первоначального знакомства и с нужной строгостью рассматриваются классы и интерфейсы, структуры и перечисления, строки и массивы, индексаторы и свойства, делегаты и события, исключения и обобщения, а также основополагающие принципы объектно-ориентированного и обобщенного программирования. Примеры программ позволяют читателю не только глубоко изучить синтаксис и семантику языка, но и получить практические навыки программирования на C#.
Второе издание дополнено главой об обобщениях - механизме «родового», иначе обобщенного программирования.
Книга рассчитана на программистов, переходящих с других языков на язык C#, на студентов и преподавателей, связанных с разработкой программ для платформы .NET.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.02: Прикладная математика и информатика
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
- 38.03.05: Бизнес-информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
uploads/2022/10/Podbelskiy_Yazyk-C-Bazovyi-kurs.pdf, огра Доступно для первоначального знакомства и с нужной строгостью рассматриваются классы и интерфейсы, структуры и перечисления, строки и массивы, индексаторы и свойства, делегаты и события, исключения и обобщения, а также основополагающие принципы объектно-ориентированного и обобщенного программирования. Примеры программ позволяют читателю не только глубоко изучить синтаксис и семантику языка, но и получить практические навыки программирования на C#. Второе издание дополнено главой об обобщениях – механизме «родового», иначе обобщенного программирования. Книга рассчитана на программистов, переходящих с других языков на язык C#, на студентов и преподавателей, связанных с разработкой программ для платформы .NET. УДК 004.438(075.8) ББК 32.973.26-018.1 УДК 004.438(075.8) ББК 32.973.26-018.1 П44 П44 Подбельский В.В. Язык С#. Базовый курс: учеб. пособие / В.В. Подбельский. – 2-е изд., перераб. и доп. – М.: Финансы и статистика, 2022. – Режим доступа: https://finstat.ru/wp-content/ ниченный. – Загл. с экрана. – 408 с.: ил. ISBN 978-5-00184-079-4 © Подбельский В.В., 2011, 2013, с изменениями, 2022 © ООО «Издательство «Финансы ISBN 978-5-00184-079-4 и статистика», 2022
Пособие предназначено для студентов, изучающих программирование, а также для читателей, желающих самостоятельно освоить язык программирования C#. В отличие от достаточно многочисленных руководств по C# данная книга посвящена именно основам языка, без знания которых невозможно обойтись при его практическом применении. Такой язык программирования, как C#, нельзя изучать «линейно», условно говоря, «от аксиом к теоремам, задачам и выводам», поэтому изложение материала (языка C# и программирования на C#) будет проходить «по спирали». К некоторым понятиям, использованным в той или иной иллюстративной программе с краткими пояснениями, в следующих темах обращаются вновь, постепенно полностью объясняя их. Пособие состоит из 18 глав. Глава 1 дает общее представление о структуре простейшей программы на языке С#. Главы 2–6 знакомят читателя с такими базовыми понятиями процедурного программирования, как константы, переменные, выражения, операторы. Однако процедурный подход к созданию программ на языке C# с неизбежностью приводит к применению тех или иных классов и объектов. Даже традиционные для языков программирования переменные базовых типов в языке C# являются «проекциями» на классы из .NET Framework. Платформа .NET Framework и особенности базовых типов языка C# как ее библиотечных классов описаны в главе 5. Главы 7 и 8 посвящены массивам и строкам. Для массивов и строк языка C# приходится различать объекты и ссылки на них. Тем самым читатель с необходимостью приходит к пониманию назначения конструкторов и особенностям применения операции new. В главе 9 рассмотрены синтаксис и семантика методов языка C#, все виды параметров и особенности применения в качестве параметров ссылок. Подробно описаны перегрузка методов, рекурсивные методы и методы с переменным числом аргументов. Глава 10, описывающая классы как контейнеры их статических членов, завершает изложение традиционного для процедур
ных языков подхода к программированию. Набор определенных пользователем классов с их статическими данными и методами практически позволяет решать в процедурном стиле любые задачи программирования. Используя средства глав 2–10, читатель может перевести на C# программу с языка Си, Паскаль или Фортран. Собственно объектно-ориентированное программирование начинается с определения пользовательских классов (глава 11). Глава 12 продолжает эту тему и посвящена концепции инкапсуляции, т. е. изучению средств создания классов, объекты которых скрывают свою внутреннюю структуру. Глава 13 посвящена отношениям между классами (и их объектами). Особое внимание уделено наследованию, абстрактным классам и виртуальным членам. Язык C# дает возможность программисту вводить свои (пользовательские) типы не только с помощью классов, но и с помощью структур, перечислений, интерфейсов и делегатов. Эти средства рассматриваются в главах 14, 15 и 17. В главе 14 рассматриваются интерфейсы, обеспечивающие множественное наследование и создание разных классов, объекты которых обладают единой функциональностью. Структуры и перечисления в языке C# – это типы значений. Именно поэтому в главе 15 рассмотрены операции упаковки и распаковки. В главе 16 подробно рассмотрен механизм исключений – их обработка и генерация. Описанных возможностей библиотечных классов исключений обычно достаточно для решения типовых задач защиты программ от ошибок. В платформе .NET Framework делегаты тесно связаны с обработкой событий. Оба этих механизма изучаются в главе 17. Особое внимание уделено реализации с помощью делегатов схемы обратных вызовов. Глава 18 включена в книгу при подготовке второго издания. Она посвящена обобщениям, механизм которых позволяет существенно повысить уровень абстракции в программировании. Наличие библиотеки обобщённых типов – одна из основных предпосылок снижения трудоёмкости разработки программного кода.
Язык C# – объектно-ориентированный язык со строгой типизацией. В объектно-ориентированных языках все является объектом – от констант и переменных базовых типов до данных агрегированных типов любой сложности... Но что такое тип? Тип в программировании понятие первичное. Тип некоторой сущности декларирует для нее совокупность возможных состояний и набор допустимых действий. Понятие сущности, мы пока не уточняем, сущностями могут быть константы, переменные, массивы, структуры и т.д. Наиболее часто понятие тип в языках программирования используют в связи с понятием «переменная». Примитивное (но пока достаточное для наших целей) определение: переменная это пара «обозначение переменной + значение переменной». Для переменной тип вводит совокупность ее возможных значений и набор допустимых операций над этими значениями. Пример определения переменной в Си, Си++, C# и некоторых других языках: spot – обозначение (имя) переменной, 16 – ее значение в данный момент (после этого определения), int – название типа переменной. Этот тип int определяет для переменной spot предельные значения, совокупность допустимых значений и набор операций с правилами их выполнения. Например, для spot определена операция получения остатка от деления (%) и особым образом определено деление на целую величину (/ в этом случае обозначает операцию целочисленного деления). Результат spot/5 равен 3, а значением выражения spot%3 будет 1. Типы в языке C# введены с помощью классов (а также структур, перечислений, интерфейсов, делегатов и массивов). Но обо всём по порядку.
Понятие класса в теоретических работах, посвященных объектно-ориентированной методологии, обычно вводится на основе понятия «объект». Объект определяют по-разному. Приведем примеры определений (см., например, [3]). «Объектом называется совокупность данных (полей), определяющих состояние объекта, и набор функций (методов), обеспечивающих изменение указанных данных (состояния объекта) и доступ к ним». «Объект – инкапсуляция множества операций (методов), доступных для внешних вызовов, и состояния, запоминающего результаты выполнения указанных операций» После подобного определения в пособиях по объектно-ориентированному программированию перечисляются обязательные признаки объектов: 1. различимость; 2. возможность одного объекта находиться в разных состояниях (в разное время); 3. возможность динамического создания объектов; 4. «умение» объектов взаимодействовать друг с другом с помощью обменов сообщениями; 5. наличие методов, позволяющих объекту реагировать на сообщения (на внешние для объекта воздействия); 6. инкапсуляция данных внутри объектов. Введя понятие объекта, класс определяют как механизм, задающий структуру (поля данных) всех однотипных объектов и функциональность объектов, то есть механизм, определяющий все методы, относящиеся к объектам. В процессе развития объектно-ориентированного подхода и при его реализации в языках программирования стало ясно, что среди данных объекта могут существовать такие, которые принадлежат не единичному объекту, а всем объектам класса. То же было выявлено и для методов – некоторые из них могли определять не функциональность отдельного (каждого) объекта, а быть общими для класса (для всех его объектов). В совокупности поля и методы как класса, так и формируемых с его помощью объектов называются членами класса. Для иллюстрации этих понятий и особенно отличий полей и методов класса от полей и методов его объектов рассмотрим пример: Класс с названием «студент группы N-го курса».
поля (данные) объекта: ФИО, оценки за сессию, взятые в библиотеке книги и т.д. методы объекта: сдать экзамен, получить книги в библиотеке и т.д. поля (данные) класса: номер курса (N), даты экзаменов, количество дисциплин в семестре и т.д. метод класса: перевести группу на следующий курс – изменятся все данные класса, но не все объекты останутся в этом измененном классе (не обязательно все студенты будут переведены на следующий курс). Различие между данными и методами объектов и данными и методами их класса существенно используется в языке C#. Чтобы их различать в определении (в объявлении) класса его данные и его методы снабжаются специальным модификатором static (статический). Примеры мы приведем позже... Итак, класс играет две роли: • класс это контейнер для методов класса и данных класса; • класс это «трафарет», позволяющий создавать конкретные объекты. Для каждого конкретного объекта, класс определяет структуру его состояния и поведение. Состояние объекта задается совокупностью значений его полей. Поведение объекта определяется набором методов, относящихся к объектам данного класса. В соответствии с объектной ориентацией языка C# – всякая программа на языке C# представляет собой класс или совокупность классов. Внутри объявления каждого класса могут быть размещены: 1. данные класса (статические поля); 2. методы класса (статические методы); 3. данные объектов класса (не статические поля); 4. методы для работы с объектами класса (не статические методы); 5. внутренние классы; 6. дополнительные члены, речь о которых еще впереди. Формат простейшего определения (иначе декларации или объявления) класса в C#:
Здесь class – служебное слово. Заключенная в обязательные фигурные скобки совокупность полей и методов называется телом класса. Среди полей и методов могут быть статические, относящиеся к классу в целом, и не статические – определяющие состояния конкретных объектов и действия над этими объектами. Перед телом класса – находится заголовок объявления класса. Заголовок в общем случае может иметь более сложную форму, но сейчас её не нужно рассматривать. Служебное слово class всегда входит в заголовок. имя_класса – идентификатор, произвольно выбираемый автором класса. Отметим, что идентификатор в языке C# – это последовательность букв, цифр и символов подчеркивания, которая не может начинаться с цифры. В отличие от многих предшествующих языков в идентификаторах C# можно использовать буквы разных алфавитов, например, русского или греческого. В языке C# прописная буква отличается от той же самой строчной. Примеры идентификаторов, наверное, излишни. Среди методов классов исполнимой программы (приложения) на языке C# обязательно присутствует статический метод со специальным именем Main. Этот метод определяет точку входа в программу – именно с выполнения операторов метода Main( ) начинается исполнение ее кода. Исполняющая программу система неявно (невидимо для программиста) создает единственный объект класса, представляющего программу, и передает управление коду метода Main( ). Прежде чем приводить примеры программ, необходимо отметить, что практически каждая программа на языке C# активно использует классы библиотеки из .NET Framework. Через библиотечные классы программе доступно то окружение, в котором она выполняется. Например, класс Console представляет в программе средства для организации консольного диалога с пользователем. Применение в программе библиотеки классов предполагает либо создание объектов классов этой библиотеки, либо обращения к статическим полям и методам библиотечных классов. Чтобы применять методы и поля библиотечных классов и создавать их объекты, необходимо знать состав библиотеки и воз
можности ее классов. Библиотека .NET настолько обширна, что на первом этапе изучения программирования на C# придется ограничиться только самыми скромными сведениями о ней. Cо средствами библиотеки классов будем знакомиться, используя некоторые из этих средств в небольших иллюстративных программах. Вначале будем рассматривать программы, в каждой из которых будут применяться только статические члены некоторых библиотечных классов, и будет только один класс с единственным методом Main(). При таких ограничениях программирование на языке C# превращается в процедурное программирование. Основное отличие от традиционного императивного подхода других процедурных языков – применение особого синтаксиса для обращения к статическим членам библиотечных классов и методам объектов, представляющих в программах данные. Для иллюстрации приведенных общих сведений о программах на C# рассмотрим программу, которая выводит в консольное окно экрана фразу «Введите Ваше имя:», считывает имя, набираемое пользователем на клавиатуре, а затем приветствует пользователя, используя полученное имя. ″″″″″″″″″″″″″″″″″″″″″″″″″Для тех, кто не знаком с синтаксисом Си, Си++ и производных от них языков, отметим, что первая строка – однострочный комментарий. Вторая строка class helloUser – это заголовок определения класса с именем helloUser. Напомним, что class — служебное слово, а идентификатор helloUser выбрал автор программы. Далее в фигурных скобках – тело класса.
В классе helloUser только один метод с заголовком static void Main() Как уже сказано, служебное слово static – это модификатор метода класса (отличающий его от методов объектов). Служебное слово void определяет тип, соответствующий особому случаю «отсутствие значения». Его использование в заголовке означает отсутствие возвращаемого методом Main() значения. В заголовке каждого метода после его имени в круглых скобках помещается список параметров (спецификация параметров). В нашем примере параметры у метода не нужны, но круглые скобки обязательны. Отметим, что имя Main не является служебным словом C#. Вслед за заголовком в определении каждого метода помещается его тело – заключенная в фигурные скобки последовательность определений, описаний и операторов. Рассмотрим тело метода Main() в нашем примере. string name; – это определение (декларация) строковой переменной с выбранным программистом именем name. string – служебное слово языка C# – обозначение предопределенного типа (System.String) для представления строк. Подробнее о типах речь пойдет позже. Для вывода информации в консольное окно используется оператор: ″″″″″″″″″″Это обращение к статическому методу WriteLine() библиотечного класса Сonsole, представляющего в программе консоль. System – обозначение пространства имен (namespace), к которому отнесен класс Console (о пространствах имён – чуть позже в § 1.3). Метод WriteLine() класса Console выводит значение своего аргумента в консольное окно. У этого метода нет возвращаемого значения, но есть аргумент. В рассматриваемом обращении к методу WriteLine() аргументом служит строковая константа ″Введите Ваше имя: ″. Ее значение – последовательность символов, размещенная между кавычек. Именно это сообщение в качестве «приглашения» увидит пользователь в консольном окне при выполнении программы. Текст с приглашением и последующим ответом пользователя для нашей программы могут иметь, например, такой вид: