Печать в консоль
Итак, у нас есть заготовка проекта, подключенная к Git:
Изначально он содержит одну команду (3-я строчка): она печатает в консоль строчку "Hello, World!" ("Привет, мир!"). Продублируем эту строчку несколько раз, немного меняя строку для печати:
Чтобы запустить проект, нажмём зелёную стрелку вверху:
Внизу откроется вкладка с консолью, и мы увидим там нашу печать:
Что такое переменная
Программы всегда работают с какими-либо данными. Переменная - это ячейка памяти, внутри которой хранятся какие-либо данные. Каждая переменная имеет своё название в коде. А в любых строго типизированных языках, таких как C#, C++, Java, Dart, TypeScript, переменные имеют также и тип данных, то есть, на переменной указано, что именно она может хранить: строку, число, логическое значение или что-то ещё.
Чтобы использовать переменную, её надо сначала создать. Например, вынесем строку "Hello, World!" в отдельную переменную под названием hello:
Ключевое слово var означает, что мы создаём новую переменную. Туда сразу же кладётся текст, а потом эта переменная используется для печати. При использовании слова var тип данных переменной определяется автоматически, по тому, что стоит в правой части равенства. В нашем случае справа стоит строка, значит, hello может хранить строку. Дальше эта строка соединяется с другими строками с помощью операции "+".
Операция присваивания
Мы можем перезаписывать значение переменной, написав "переменная = что-то", и это "что-то" будет положено в переменную. Например, здесь мы два раза перезаписываем переменную hello:
Это никакое не уравнение, как в математике, нет! Это операция присваивания, то есть, значение справа от "=" вычисляется и кладётся в ту переменную, которая написана слева от "=". Слева может быть только одна переменная и ничего больше! Например, написать так нельзя:
Кстати, если мы запустим программу, то обнаружим, что результат в консоли испортился. Почините это.
Типы данных
При создании переменной вместо var можно указать тип данных. Например, так:
Теперь у переменной явно написано, что она может хранить строку (string).
В C# есть много типов данных, мы разберём только те, которые наиболее часто используются на практике:
- int - целое число
- double - число с точкой, можно хранить очень большие или очень маленькие числа, но есть погрешность при вычислениях. Напр., счётчик литров воды, размер атома, размер Вселенной.
- decimal - число с точкой, точные вычисления. Напр., деньги. Значение пишется через точку с буквой m.
- string - строка, а точнее, любой текст (в том числе из нескольких строк). Значение пишется в двойных кавычках. Чтобы написать двойные кавычки внутри текста, напишите \". Переход на новую строку - \n. Попробуйте это. Операция + соединяет строки между собой, а также соединяет строку и любое другое значение, которое при этом превращается в строку (16-ая строка нашего кода).
- bool - логическое значение, то есть, истина (true) или ложь (false). Используется буквально на каждом шагу. Напр., находится ли сотрудник в отпуске, сделана ли уже задача, расписался ли сотрудник за инструктаж по технике безопасности и т.д..
- byte - байт данных. Напр., из таких байтов состоят картинки, видео, документы и пр..
- Guid - идентификатор. Позволяет отличить один объект от другого. Например, в программе для чата используются такие объекты, как пользователь, чат, сообщение. Идентификаторы позволяют отличить одного пользователя от другого, даже если у них одинаковые ФИО. Отличить один чат от другого и одно сообщение от другого, даже если сообщения редактировались. Идея в том, что идентификатор присваивается объекту в момент его создания и больше никогда не меняется, даже если меняется сам объект. Идентификаторы уникальны в пределах всей Земли :) Guid.NewGuid() генерирует новый уникальный идентификатор. Guid.Parse(строка) считывает идентификатор из строки (тип string) в специальном формате. Guid.Empty - идентификатор, состоящий изо всех нулей.
- DateTime - момент времени. Состоит из даты и времени суток. DateTime.Parse(строка) считывает дату и время, указанные в формате "2026-12-31 23:59:59". DateTime.Now - это текущий момент времени.
Типы данных принято указывать только там, где нельзя написать var. Везде, где только можно, используется var. Это соглашение о стиле кода, то есть, вы можете написать тип данных вместо var и это будет работать, но так делать не принято.
Верблюжий регистр
Вы можете называть переменные почти как угодно и всё будет работать, но по стилю кода принято писать их названия в верблюжьемРегистреСМаленькойБуквы.
Комментарии и самодокументируемый код
Комментарии позволяют добавить к коду какие-либо пояснения на человеческом языке. По стилю кода, комментарии используются лишь в сложных случаях, когда по названиям переменных нельзя догадаться, что происходит. Код стараются писать так, чтобы он был понятен без комментариев - это называется "самодокументируемый код". В частности, каждую переменную надо называть так, чтобы было понятно, что в ней лежит. Код чаще читают, чем пишут, и часто ваш код будут читать ваши коллеги, да и вы сами через несколько месяцев забудете, что же вы имели в виду, когда писали этот кусок кода. Надо называть всё в коде так, чтобы им было понятно.
Операции
Мы уже видели, что строки можно соединять друг с другом или с другими объектами с помощью операции +. Над числами можно делать все основные операции, такие как +, -, * (умножить), / (делить). Также иногда используется % (остаток от деления), напр., 5 % 3 будет 2, а 107 % 10 будет 7. Он позволяет, например, раскрасить пользователей чата разными цветами - берём числовой номер каждого пользователя, делим на 10 и в зависимости от того, что получится (0, 1, 2... или 9), выбираем один из 10 цветов. Порядок операций - как в математике, то есть, сначала выполняется умножение и деление, а потом всё остальное. Есть обычные круглые скобки.
Например, создадим два числа и вычислим их среднее арифметическое:
После запуска программы содержимое переменной resultText будет распечатано в консоль.
Однако даже здесь есть грабли. Все числа, с которыми работаем - 0, 100 и 2 - целые. Операция деления целых чисел всегда выдаёт в результат целое число. То есть, результат будет округлён, а нас даже не спросят об этом! Например, заменим 0 на 1. Среднее арифметическое 1 и 100 - это (1 + 100) / 2 = 50,5. Однако мы увидим целое 50. Чтобы округления не было, нужно сделать одно из чисел, которые участвуют в делении, дробным. Для этого заменим 2 (тип данных int) на 2.0 (тип данных double). Проверим снова - работает!
Запись со сложением строк слишком громоздкая. Есть сокращённый вариант - когда перед строкой ставится $, а вставляемые переменные пишутся прямо внутри строки в фигурных скобках:
Можно написать результат прямо в Console.WriteLine(...), не заводя промежуточную переменную:
Интереснее, когда исходные числа не зашиты в программе, а вводятся пользователем в консоль. Для этого служит команда Console.ReadLine(). Обратите внимание на пустые скобки - они обязательны. Результат этой команды - строка (тип данных string). Поэтому, если мы хотим считать число, нужно результат этой команды подать на вход другой команде, которая преобразует строку в нужный тип данных - int.Parse(какаяЛибоСтрока). Получится так:
Программирование - это как конструктор: мы можем из элементарных действий строить сколь угодно сложные выражения, главное, чтобы они подходили друг к другу по типу данных. Например, написать так нельзя:
потому что команда int.Parse(...) ожидает на своём входе строку, а не число. Правильно так:
ну или так:
Мы можем написать даже
- эта команда будет печатать в консоль то, что мы только что ввели. Ну или
Сохранение в Git
После каждой темы мы будем делать сохранения в Git. Это поможет нам удобнее смотреть, что мы сделали по каждой теме, а также добавит точку восстановления, к которой можно откатиться, если что-то пойдёт не так. Как настроить Git, читайте в первой статье - https://dzen.ru/a/aVaFX7K_jnndcBoG#podklyuchaem_proekt_k_git
Откроем вкладку Commit (слева вверху), выделим файл для сохранения, введём название сохранения и нажмём кнопку Commit.
Сохранения можно просмотреть на вкладке Git (внизу):