Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы объектно ориентированного программирования на языке С# базовые сведения о языке. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Министерство науки и высшего образования Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
М. Э. Рояк, И. М. Ступаков
ОСНОВЫ ОБЪЕКТНО
ОРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ
НА ЯЗЫКЕ C#
БАЗОВЫЕ СВЕДЕНИЯ
О ЯЗЫКЕ
Утверждено Редакционно-издательским советом
университета в качестве учебного пособия
НОВОСИБИРСК
2023
УДК 004.434 (075.8)
Р816
Рецензенты: канд. техн. наук А. Н. Игнатьев
канд. техн. наук, доцент Ю. В. Тракимус
Работа подготовлена на кафедре прикладной математики
Рояк М. Э.
P816 Основы объектно ориентированного программирования на
языке С#: базовые сведения о языке: учебное пособие / М. Э. Рояк, И. М. Ступаков. – Новосибирск: Изд-во НГТУ,
2023. – 70 с.
ISBN 978-5-7782-5096-3
В настоящем учебном пособии излагаются основные особенности и некоторые приемы программирования на языке C#. Учебное пособие будет полезно студентам, обучающимся на факультете прикладной математики и информатики по дисциплинам «Основы объектно ориентированного программирования», «Современные технологии программирования».
ISBN 978-5-7782-5096-3 © Рояк М. Э., Ступаков И. М., 2023 © Новосибирский государственный технический университет, 2023
УДК 004.434 (075.8)
Оглавление
Введение ........................................................................................................................................... 5
1. Основные типы ............................................................................................................................. 8
1.1. Арифметические типы и константы ............................................................................ 8
1.2. Логический тип ............................................................................................................ 10
1.3. Перечислимый тип ...................................................................................................... 10
1.4. Строковый тип ............................................................................................................. 11
1.5. Тип object ...................................................................................................................... 12
2. Выражения и операции .............................................................................................................. 13
2.1. Арифметические выражения ...................................................................................... 13
2.2. Побитовые операции ................................................................................................... 14
2.3. Операции сравнения .................................................................................................... 14
2.4. Логические операции .................................................................................................. 15
2.5. Операции сдвига .......................................................................................................... 15
3. Основные операторы ................................................................................................................. 16
3.1. Описание типа переменной ........................................................................................ 17
3.2. Операторы присваивания ............................................................................................ 18
3.3. Условный оператор и условное выражение .............................................................. 19
3.4. Оператор цикла с предусловием ................................................................................ 19
3.5. Оператор цикла с постусловием ................................................................................ 19
3.6. Оператор цикла for ...................................................................................................... 19
3.7. Операция is ................................................................................................................... 20
3.8. Оператор switch ............................................................................................................ 21
3.9. Оператор безусловного перехода ............................................................................... 24
3.10. Исключения ................................................................................................................ 24
4. Методы (подпрограммы) ........................................................................................................... 26
4.1. Ключевые слова out и ref ............................................................................................ 26
4.2. Ключевое слово in ....................................................................................................... 27
4.3. Параметры со значениями по умолчанию ................................................................. 28
4.4. Позиционные и ключевые параметры ....................................................................... 28
4.5. Переменное число параметров ................................................................................... 29
4.6. Оператор return ............................................................................................................ 30
5. Классы. Члены класса. Структуры ........................................................................................... 31
5.1. Модификаторы доступности ...................................................................................... 31
5.2. Создание экземпляра класса. Конструктор ............................................................... 32
5.3. Ключевое слово this ..................................................................................................... 34
5.4. Модификаторы static и const ...................................................................................... 34
5.5. Поля и свойства ........................................................................................................... 35
5.6. Модификаторы readonly и required ............................................................................ 37
5.7. Индексатор ................................................................................................................... 37
5.8. Ссылочные типы и типы-значения ............................................................................ 38
5.9. Условные выражения для синтаксического упрощения работы с null .................. 40
5.10. Делегаты ..................................................................................................................... 41
5.11. События ...................................................................................................................... 42
5.12. Структуры ................................................................................................................... 45
5.13. Перегрузка операторов .............................................................................................. 45
5.14. Сборка мусора и методы завершения ...................................................................... 46
6. Одномерные и многомерные массивы ..................................................................................... 48
7. Работа со строками .................................................................................................................... 50
7.1. Редактирование строк. StringBuilder .......................................................................... 50
7.2. Чтение данных ............................................................................................................. 51
8. Кортежи ....................................................................................................................................... 52
9. Наследование .............................................................................................................................. 54
9.1. Базовый класс object .................................................................................................... 55
9.2. Тип record ..................................................................................................................... 55
9.3. Тип record struct ........................................................................................................... 57
9.4. Создание экземпляра класса при наследовании ....................................................... 57
10. Интерфейсы .............................................................................................................................. 58
10.1. Идея и синтаксические особенности ....................................................................... 58
10.2. Интерфейс IDisposable .............................................................................................. 60
11. Универсальные шаблоны ........................................................................................................ 62
11.1. Синтаксис шаблонов ................................................................................................. 62
11.2. Ковариантность и контравариантность ................................................................... 63
11.3. Интерфейсы перечисления. Оператор foreach ........................................................ 65
11.4. Формирование перечисления функцией. Оператор yield return ......................... 68
Список рекомендуемой литературы ............................................................................................ 69
ВВЕДЕНИЕ
Язык C# не слишком старый. Он разработан в 1998 – 2001 годах груп-
пой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота как язык разработки приложений для платформы Microsoft .NET Framework. Однако более-менее широко распространяться он начал с ноября 2005 года с выходом Visual Studio 2005 и .NET 2.0.
Синтаксис языка во многом похож на С++, часть конструкций авторы
«подсмотрели» в Java. Очевидным достоинством языка C# является удале­ние некоторых конструкций C++, являющихся наследием языка С и нару­шающих принципы объектно ориентированного подхода (ООП). Изучать C# начинающему программисту, как нам кажется, значительно проще, чем С++, особенно если необходимо изучить именно ООП. В большинстве си­туаций C# чисто синтаксически не позволяет начинающему программисту слишком сильно отклоняться от принципов ООП, при этом сохраняя, в от­личие от того же языка Java, относительную лаконичность синтаксических конструкций.
Настоящее учебное пособие рассчитано на читателей, уже знакомых
(хотя бы на начальном уровне) с каким-то языком программирования, по­этому мы не будем в подробностях объяснять, что такое цикл, массив, под­программа и т. д., а постараемся сосредоточиться именно на особенностях ООП и его реализации в C#. При этом мы надеемся, что даже для доста­точно опытных программистов это учебное пособие может оказаться по­лезным, если они хотят изучить C# как еще один язык. Поскольку на ФПМИ НГТУ традиционно первым изучаемым языком программирования является С++ (точнее, его подмножество, доставшееся в наследство от языка С), мы будем иногда пояснять отличия возможностей C# от С++, однако надеемся, что это не помешает читателям, слабо знакомым с С++.
В этой книге мы постараемся кратко изложить синтаксис и семантику
основных конструкций языка. Естественно, настоящее учебное пособие не претендует на исчерпывающий справочник по синтаксису, поэтому в сложных ситуациях рекомендуем обратиться либо к документации Mi­crosoft https://learn.microsoft.com/en-us/dotnet/csharp/language-reference, либо к стандарту языка (например, на странице https://www.ecma-interna-
tional.org/publications-and-standards/standards/ecma-334/ выложены принятые
международные стандарты языка, на момент написания этого текста там обсуждается стандарт 7.0, а версия C#, которая выйдет в декабре 2023 года, – 12).
5
Многие особенности языка объясняются тем, что он разрабатывался
как язык программирования прикладного уровня для CLR (Common Lan­guage Runtime, общеязыковая среда выполнения, разрабатываемая Mi­crosoft). Все компиляторы, работающие с CLR, должны преобразовывать программу на языке высокого уровня в программу CIL (Common Interme­diate Language – «высокоуровневый ассемблер» виртуальной машины).
Затем программа CIL (иногда называемая «байт-код») компилируется
и выполняется в среде CLR. Наличие специальной среды выполнения поз­воляет использовать в C# некоторые специальные возможности, напри­мер, определение типа во время выполнения, получение списка полей класса и т. д. Кроме того, скомпилированные программы могут быть не привязаны к операционной системе, разрядности и даже типу процессора. Даже одна из основных возможностей языка, сборка мусора, реализуется не во время компиляции, а является частью CLR. На данный момент суще­ствует несколько реализаций CLR, и поведение программ, написанных для одной реализации, может отличаться при их компиляции и запуске для другой реализации (в первую очередь, конечно, могут отсутствовать или менять свое поведение используемые библиотечные функции, но иногда отличается и поведение базовых средств языка, например сборки мусора).
Все примеры в этом пособии компилировались и выполнялись с ис-
пользованием наиболее современной кроссплатформенной версии .NET 7.0.
Для написания и отладки программ на C# существует много возмож-
ностей. Для начинающих программистов лучше использовать Visual Stu­dio как наиболее полный, хоть и несколько громоздкий, инструмент. До­статочно удобным и кроссплатформенным является Visual Studio Code с соответствующими расширениями. В любом случае мы рекомендуем уста­новить .NET SDK последней версии (сайт dotnet.microsoft.com, на момент выхода этого пособия – восьмая версия) и создать первый проект из ко­мандной строки командой dotnet new console, находясь в пустой папке. В папке появятся два файла. Первый файл, файл проекта, имеет расшире­ние csproj, является текстовым файлом (его можно открыть в любом тек­стовом редакторе) и содержит параметры сборки (настройки языка, целе­вую платформу и т. д.). Второй файл, program.cs, содержит программу из одной строчки:
Console.WriteLine("Hello, World!");
6
Для компиляции и выполнения этой программы можно использовать ко­манду dotnet run. Заметим, что, начиная с 9-й версии языка, головная про­грамма в C# не требует никаких дополнительных описаний. Если какой­либо файл проекта начинается с программы без заголовка, то она счита­ется головной, и выполнение начинается с нее (естественно, такой файл должен быть единственным).
Console – статический тип, используемый в C# для работы со стан-
дартными потоками ввода-вывода (по умолчанию это вывод на экран и ввод с клавиатуры). Вывод строки, как видно из приведенной программы, осуществляется вызовом метода WriteLine, ввод строки – вызовом метода ReadLine.
Изначально мы хотели вести изложение последовательно, чтобы но-
вая информация основывалась только на уже изложенной, без ссылок впе­ред на еще не определенные понятия. Однако в C# различные возможности настолько тесно взаимосвязаны, что этот подход очень затрудняет пони­мание некоторых аспектов языка. Как минимум поэтому нам приходится во введении использовать понятия «статический тип» и «метод» до их определения …
Сделаем еще одно (надеемся, последнее) «опережающее» пояснение.
В языке C# нет указателей (по крайней мере, их нет для начинающих про­граммистов, до изучения небезопасных методов unsafe), но есть ссылоч­ные типы и переменные, которые могут хранить ссылки. Для обозначения пустой (нулевой) ссылки служит ключевое слово null. Все переменные в языке C# должны быть проинициализированы до первого использования их значений (компилятор за этим следит), и все ссылочные переменные инициализируются по умолчанию значением null.
7
1. ОСНОВНЫЕ ТИПЫ
слово
С++
char
short int
знаком
long int
знаком
31 …231
int64
_t
знаком
char
short
int
long long
или
long)
(
uint или
ulong
)
1.1. Арифметические типы и константы
Основные арифметические типы совпадают по ключевым словам и
смыслу с типами С++, поэтому для них мы приведем просто поясняющую таблицу
Ключевое
Аналог в
Пояснение Диапазон значений
sbyte signed
short short,
int int, long,
long long long,
byte unsigned
ushort unsigned
uint unsigned
ulong unsigned
8-битное целое со знаком –128…127
16- битное целое со
32-битное целое со
64-битное целое со
8-битное целое без знака 0…255
16-битное целое без знака 0…65535
32-битное целое без знака 0…232–1
64-битное целое без знака 0…264–1
nint intptr_t Целое со знаком, размер
которого определяется разрядностью процесса во время выполнения (int
nuint uintptr_t Целое без знака, размер
которого определяется разрядностью процесса во время выполнения
−32768…32767
−2
63 …263
−2
–1
–1
8
float float Вещественное число оди-
дарту
IEC 60559
стандарту
IEC 60559
308
308
нарной точности по стан-
–3.4·1038…3.4·1038
double double Вещественное число
–1.7·10
…1.7·10
двойной точности по
Заметим, что все перечисленные в таблице типы могут неявно преоб-
разовываться друг в друга в выражениях (но, в отличие от многих других языков, запрещены преобразования по умолчанию с возможной потерей точности, например, переменной типа int нельзя присвоить значение типа long без явного преобразования).
Константы перечисленных в таблице типов имеют вид, аналогичный
константам арифметических типов других языков (123, 1.23, 1e – 10). Если необходимо явно задать тип константы, то задается литерал с буквами в конце, которые и определяют тип, например, 123l – знаковая константа типа long, 123UL – константа типа ulong. Заметим, что в константе можно отделять разряды символом подчеркивания, например, двоичная кон­станта может иметь вид 0b_0010_1010 .
Символьный тип char в C# формально также относится к арифмети-
ческим типам. Однако, в отличие от С++, он не может неявно преобразо­вываться в другие арифметические типы, также невозможно и неявное об­ратное преобразование. Кроме того, char в C# занимает 2 байта, является беззнаковым, и константа этого типа определяется как символ в одинар­ных кавычках (при этом можно определять символ его шестнадцатерич­ным кодом, например, '\x0001').
Для финансовых вычислений с высокой точностью в С# введен тип
decimal, не имеющий аналогов в С++. Тип занимает 128 бит и предназна­чен для хранения вещественных чисел в десятичном формате, с точностью 28 десятичных знаков мантиссы, диапазон значений этого типа –7.9·10
28
… 7.9·1028, при этом все арифметические операции над типом вы­полняются без перехода в двоичный формат, что позволяет избежать оши­бок округления из-за непредставимости десятичных дробей в двоичной си­стеме счисления (например, 0.1 в двоичной системе – периодическая дробь). В отличие от вещественных типов float и double, тип decimal не поддерживает специальные значения (бесконечность, не число и т. д.) и не может смешиваться в одном выражении с другими вещественными типами
9
без явных преобразований. Заметим, что использовать этот тип не для фи­нансовых вычислений без острой необходимости не стоит, поскольку опе­рации над значениями этого типа достаточно затратны по сравнению с обычными вещественными операциями. Литерал типа decimal заканчива­ется буквой m (d уже занята для вещественных констант двойной точно­сти), например 1.230110m .
1.2. Логический тип
Для представления логических значений true и false в C# используется
тип bool. В отличие от С++, тип bool не является арифметическим, и не существует даже явных преобразований этого типа в арифметический и из арифметического в логический. Поэтому в C# нельзя перепутать логиче­ские выражения с арифметическими, что часто происходит в C++.
1.3. Перечислимый тип
В отличие от С++, в C# перечислимый тип не является арифметиче-
ским, хотя для него существует явное преобразование к целому типу.
Перечислимый тип определяет серию именованных констант с цело-
численным внутренним представлением. Простейший пример
enum Color {Red, Green, Blue}
определяет константы со значениями 0, 1, 2. Для перечислимого типа можно явно указать, в каком виде будут храниться константы, например:
enum Color:byte {Red, Green, Blue}
Так же как и в C++, значения констант можно задать явно, например:
enum Color:int {Red=-2, Green, Blue=10}
Если при этом значение константы не задано явно, то она получает значе­ние предыдущей константы, увеличенное на единицу.
Заметим, что обратиться к этим константам можно, но только исполь-
зуя имя типа, например, Color.Green, а для получения значения потребу­ется явное преобразование, например (int) Color.Green.
10
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]