Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы объектно ориентированного программирования на языке С# базовые сведения о языке. Учебное пособие
.pdf
Министерство науки и высшего образования Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
М. Э. Рояк, И. М. Ступаков
ОСНОВЫ ОБЪЕКТНО
ОРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ
НА ЯЗЫКЕ 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# от С++,
однако надеемся, что это не помешает читателям, слабо знакомым с С++.
В этой книге мы постараемся кратко изложить синтаксис и семантику
основных конструкций языка. Естественно, настоящее учебное пособие не
претендует на исчерпывающий справочник по синтаксису, поэтому в
сложных ситуациях рекомендуем обратиться либо к документации Microsoft 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 Language Runtime, общеязыковая среда выполнения, разрабатываемая Microsoft). Все компиляторы, работающие с CLR, должны преобразовывать
программу на языке высокого уровня в программу CIL (Common Intermediate Language – «высокоуровневый ассемблер» виртуальной машины).
Затем программа CIL (иногда называемая «байт-код») компилируется
и выполняется в среде CLR. Наличие специальной среды выполнения позволяет использовать в C# некоторые специальные возможности, например, определение типа во время выполнения, получение списка полей
класса и т. д. Кроме того, скомпилированные программы могут быть не
привязаны к операционной системе, разрядности и даже типу процессора.
Даже одна из основных возможностей языка, сборка мусора, реализуется
не во время компиляции, а является частью CLR. На данный момент существует несколько реализаций CLR, и поведение программ, написанных для
одной реализации, может отличаться при их компиляции и запуске для
другой реализации (в первую очередь, конечно, могут отсутствовать или
менять свое поведение используемые библиотечные функции, но иногда
отличается и поведение базовых средств языка, например сборки мусора).
Все примеры в этом пособии компилировались и выполнялись с ис-
пользованием наиболее современной кроссплатформенной версии
.NET 7.0.
Для написания и отладки программ на C# существует много возмож-
ностей. Для начинающих программистов лучше использовать Visual Studio как наиболее полный, хоть и несколько громоздкий, инструмент. Достаточно удобным и кроссплатформенным является 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
