Найти в Дзене
"Мы"-Прогер

Изучаем C# - первые команды, типы данных

Итак, у нас есть заготовка проекта, подключенная к Git: Изначально он содержит одну команду (3-я строчка): она печатает в консоль строчку "Hello, World!" ("Привет, мир!"). Продублируем эту строчку несколько раз, немного меняя строку для печати: Чтобы запустить проект, нажмём зелёную стрелку вверху: Внизу откроется вкладка с консолью, и мы увидим там нашу печать: Программы всегда работают с какими-либо данными. Переменная - это ячейка памяти, внутри которой хранятся какие-либо данные. Каждая переменная имеет своё название в коде. А в любых строго типизированных языках, таких как C#, C++, Java, Dart, TypeScript, переменные имеют также и тип данных, то есть, на переменной указано, что именно она может хранить: строку, число, логическое значение или что-то ещё. Чтобы использовать переменную, её надо сначала создать. Например, вынесем строку "Hello, World!" в отдельную переменную под названием hello: Ключевое слово var означает, что мы создаём новую переменную. Туда сразу же кладётся текст,
Оглавление

Печать в консоль

Итак, у нас есть заготовка проекта, подключенная к Git:

Файл Program.cs
Файл Program.cs

Изначально он содержит одну команду (3-я строчка): она печатает в консоль строчку "Hello, World!" ("Привет, мир!"). Продублируем эту строчку несколько раз, немного меняя строку для печати:

-2

Чтобы запустить проект, нажмём зелёную стрелку вверху:

-3

Внизу откроется вкладка с консолью, и мы увидим там нашу печать:

Консоль с результатами
Консоль с результатами

Что такое переменная

Программы всегда работают с какими-либо данными. Переменная - это ячейка памяти, внутри которой хранятся какие-либо данные. Каждая переменная имеет своё название в коде. А в любых строго типизированных языках, таких как C#, C++, Java, Dart, TypeScript, переменные имеют также и тип данных, то есть, на переменной указано, что именно она может хранить: строку, число, логическое значение или что-то ещё.

Чтобы использовать переменную, её надо сначала создать. Например, вынесем строку "Hello, World!" в отдельную переменную под названием hello:

Переменная с названием hello хранит строку "Hello, World!"
Переменная с названием hello хранит строку "Hello, World!"

Ключевое слово var означает, что мы создаём новую переменную. Туда сразу же кладётся текст, а потом эта переменная используется для печати. При использовании слова var тип данных переменной определяется автоматически, по тому, что стоит в правой части равенства. В нашем случае справа стоит строка, значит, hello может хранить строку. Дальше эта строка соединяется с другими строками с помощью операции "+".

Операция присваивания

Мы можем перезаписывать значение переменной, написав "переменная = что-то", и это "что-то" будет положено в переменную. Например, здесь мы два раза перезаписываем переменную hello:

Операция присваивания
Операция присваивания

Это никакое не уравнение, как в математике, нет! Это операция присваивания, то есть, значение справа от "=" вычисляется и кладётся в ту переменную, которая написана слева от "=". Слева может быть только одна переменная и ничего больше! Например, написать так нельзя:

-7

Кстати, если мы запустим программу, то обнаружим, что результат в консоли испортился. Почините это.

Типы данных

При создании переменной вместо var можно указать тип данных. Например, так:

-8

Теперь у переменной явно написано, что она может хранить строку (string).

В C# есть много типов данных, мы разберём только те, которые наиболее часто используются на практике:

-9
  • 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 и это будет работать, но так делать не принято.

Верблюжий регистр

Вы можете называть переменные почти как угодно и всё будет работать, но по стилю кода принято писать их названия в верблюжьемРегистреСМаленькойБуквы.

Комментарии и самодокументируемый код

Комментарии позволяют добавить к коду какие-либо пояснения на человеческом языке. По стилю кода, комментарии используются лишь в сложных случаях, когда по названиям переменных нельзя догадаться, что происходит. Код стараются писать так, чтобы он был понятен без комментариев - это называется "самодокументируемый код". В частности, каждую переменную надо называть так, чтобы было понятно, что в ней лежит. Код чаще читают, чем пишут, и часто ваш код будут читать ваши коллеги, да и вы сами через несколько месяцев забудете, что же вы имели в виду, когда писали этот кусок кода. Надо называть всё в коде так, чтобы им было понятно.

-10

Операции

Мы уже видели, что строки можно соединять друг с другом или с другими объектами с помощью операции +. Над числами можно делать все основные операции, такие как +, -, * (умножить), / (делить). Также иногда используется % (остаток от деления), напр., 5 % 3 будет 2, а 107 % 10 будет 7. Он позволяет, например, раскрасить пользователей чата разными цветами - берём числовой номер каждого пользователя, делим на 10 и в зависимости от того, что получится (0, 1, 2... или 9), выбираем один из 10 цветов. Порядок операций - как в математике, то есть, сначала выполняется умножение и деление, а потом всё остальное. Есть обычные круглые скобки.

Например, создадим два числа и вычислим их среднее арифметическое:

-11

После запуска программы содержимое переменной resultText будет распечатано в консоль.

Однако даже здесь есть грабли. Все числа, с которыми работаем - 0, 100 и 2 - целые. Операция деления целых чисел всегда выдаёт в результат целое число. То есть, результат будет округлён, а нас даже не спросят об этом! Например, заменим 0 на 1. Среднее арифметическое 1 и 100 - это (1 + 100) / 2 = 50,5. Однако мы увидим целое 50. Чтобы округления не было, нужно сделать одно из чисел, которые участвуют в делении, дробным. Для этого заменим 2 (тип данных int) на 2.0 (тип данных double). Проверим снова - работает!

Запись со сложением строк слишком громоздкая. Есть сокращённый вариант - когда перед строкой ставится $, а вставляемые переменные пишутся прямо внутри строки в фигурных скобках:

Доллар-строки
Доллар-строки

Можно написать результат прямо в Console.WriteLine(...), не заводя промежуточную переменную:

-13

Интереснее, когда исходные числа не зашиты в программе, а вводятся пользователем в консоль. Для этого служит команда Console.ReadLine(). Обратите внимание на пустые скобки - они обязательны. Результат этой команды - строка (тип данных string). Поэтому, если мы хотим считать число, нужно результат этой команды подать на вход другой команде, которая преобразует строку в нужный тип данных - int.Parse(какаяЛибоСтрока). Получится так:

-14

Программирование - это как конструктор: мы можем из элементарных действий строить сколь угодно сложные выражения, главное, чтобы они подходили друг к другу по типу данных. Например, написать так нельзя:

-15

потому что команда int.Parse(...) ожидает на своём входе строку, а не число. Правильно так:

-16

ну или так:

-17

Мы можем написать даже

-18

- эта команда будет печатать в консоль то, что мы только что ввели. Ну или

-19

Сохранение в Git

Вкладка Commit в Rider
Вкладка Commit в Rider

После каждой темы мы будем делать сохранения в Git. Это поможет нам удобнее смотреть, что мы сделали по каждой теме, а также добавит точку восстановления, к которой можно откатиться, если что-то пойдёт не так. Как настроить Git, читайте в первой статье - https://dzen.ru/a/aVaFX7K_jnndcBoG#podklyuchaem_proekt_k_git

Откроем вкладку Commit (слева вверху), выделим файл для сохранения, введём название сохранения и нажмём кнопку Commit.

Сохранения можно просмотреть на вкладке Git (внизу):

Вкладка Git в Rider
Вкладка Git в Rider