C#, Junior

Встроенные типы в C#

Мы продолжаем знакомиться с языком программирования C#. Сегодня поговорим о типах данных и начнем с наиболее часто используемых – встроенных типов. К ним относятся:

  • Целочисленный
  • С плавающей запятой
  • Логический
  • Символьный
  • Строковый

Они идут вместе с языком и для работы с ними не нужно подключать дополнительные библиотеки. Вообще, таких типов гораздо больше, но сегодня мы познакомимся с самыми основными.

Но для начала, поговорим о переменных.

Переменные

Переменную можно представлять как коробку.

  • У каждой коробки есть наклейка – ее имя (название переменной). По названию мы можем догадаться, что в ней лежит.
  • У коробки есть форма – ее тип (тип переменной). В одни коробки можно класть только книги, в другие – только яблоки, в третьи – только посуду.
  • То, что лежит внутри коробки – это значение. Сегодня в коробке с яблоками лежит 5 яблок, завтра мы можем достать 5 и положить 10.

В коде на C# это может выглядеть так:

// Мы говорим компьютеру:
// 1. Возьми коробку с наклейкой "age"
// 2. Эта коробка предназначена ТОЛЬКО для целых чисел (int)
// 3. Положи в нее значение 25
int age = 25;

// А теперь команда: достань значение из коробки "age" и напечатай его!
Console.WriteLine(age); // Напечатает: 25

// Потом мы решили поменять то, что лежит в коробке.
// Убрали 25 и положили 26.
age = 26;
Console.WriteLine(age); // Теперь напечатает: 26

То есть переменная – это место в памяти компьютера, у которого есть имя (как мы к нему обращаемся), тип (что именно мы можем в него положить: число, текст и т.д.) и значение (то, что лежит внутри прямо сейчас). Значение можно менять, но тип менять нельзя.

Про типизацию

Если бы нужно было описать C# одним словом, то “строгий” подошло бы идеально. Но не в смысле “суровый”, а в смысле “четкий, принципиальный и соблюдающий правила”.

Другими словами, C# требует ясности и не любит неопределенности. Вы должны заранее объявить, какого типа данные будет хранить переменная (например, число или текст). И после этого язык будет строго следить, чтобы вы не пытались работать с этими данными как с чем-то другим.

Представьте, что у вас есть коробки с надписями:

  • “Фрукты” – можно класть только яблоки, апельсины и т.д.
  • “Посуда” – только тарелки, чашки.
  • “Игрушки” – только машинки, куклы.

C# – это тот самый строгий складской работник, который не даст вам положить яблоко в коробку с посудой. Он заранее проверяет эти правила (на этапе компиляции) и просто не допустит сборки программы, если они нарушены.

Главные следствия строгой типизации:

  1. Обязательное объявление типа. Вы не можете просто создать переменную. Вы должны сразу сказать, какого она типа.

Так можно:

int number; // Объявляем переменную типа "целое число"
string text; // Объявляем переменную типа "строка"
bool isReady; // Объявляем переменную "логического" типа (да/нет)

Так нельзя в C# (в отличие от, например, JavaScript или Python):

number = 10; // Ошибка! Что такое number? Какой у него тип?
  1. Невозможность смешивать типы. Самое главное правило: нельзя присвоить переменной значение несовместимого типа.
int number;
number = 10; // Все ок, 10 - это целое число
number = "Привет"; // ОШИБКА! Строку нельзя положить в переменную для чисел.

string text;
text = "Привет"; // Ок
text = 10; // ОШИБКА! Число нельзя положить в переменную для строк.
  1. Контроль на этапе написания кода (компиляции). Эта строгость очень полезна! Ошибки, связанные с неправильным использованием типов, компилятор найдет еще до того как вы запустите программу. Это избавляет от множества коварных ошибок, которые в других языках всплывают только во время работы программы.

А теперь, давайте рассмотрим каждый встроенный тип подробнее.

Целочисленный тип

Целочисленные типы – это типы данных для целых чисел (без дробной части). Как номера страниц в книге – 1, 2, 3, но не 1.5.

Таких типов несколько – чтобы экономно использовать память. Главное правило – выбирайте тип в зависимости от того, насколько большое число вы хотите в него положить.

Представьте себе контейнеры разного размера:

Небольшие числа

  • sbyte (-128 до 127) – Крошечная баночка. Для очень маленьких чисел.
  • byte (0 до 255) – Та же баночка, но только для положительных. Например, для цвета пикселя.
  • short (~ -32 тыс. до +32 тыс.) – Небольшая коробка. Для счетчиков, небольших сумм.

Самый частый и удобный

  • int (~ -2 млрд. до +2 млрд.) – Большая, стандартная картонная коробка. Используется чаще всего по умолчанию. Хватит для большинства задач: возраст, цена, количество предметов в инвентаре.

Для огромных чисел

  • long (ОЧЕНЬ большое число) – Огромный грузовой контейнер. Нужен для астрономических расчетов, когда int уже не хватает.

Основной вывод – когда нужно работать с целыми числами, в 95% случаев начинайте с int. Он самый удобный и привычный. Про остальные типы пока нужно просто знать. К ним можно будет вернуться, когда столкнетесь с задачей, где нужно сэкономить память или работать с огромными значениями.

int age = 25;          // Возраст - всегда целое число
int coins = 100;       // Количество монет
long distanceToMoon = 384400000; // Большое число - нужен long

Основные операции, которые можно выполнять с целыми числами – это арифметические и операции сравнения.

Арифметические: +, -, *, /, %, ++, --

int a = 10, b = 3;

Console.WriteLine(a + b);  // 13 (сложение)
Console.WriteLine(a - b);  // 7 (вычитание)
Console.WriteLine(a * b);  // 30 (умножение)
Console.WriteLine(a / b);  // 3 (деление, целая часть)
Console.WriteLine(a % b);  // 1 (остаток от деления)

a++; // 11 (увеличение значения на единицу - инкремент)
b--; // 2 (уменьшение значения на единицу - декремент)

Сравнение: ==, !=, >, <, >=, <=

int x = 5, y = 8;

Console.WriteLine(x == y); // False (равно)
Console.WriteLine(x != y); // True (не равно)
Console.WriteLine(x > y);  // False (больше)
Console.WriteLine(x < y);  // True (меньше)
Console.WriteLine(x >= 5); // True (больше или равно)
Console.WriteLine(y <= 7); // False (меньше или равно)

Числа с плавающей запятой

Это типы данных для дробных чисел (с запятой). Например: 3.14, -10.5, 0.001.

Название «плавающая запятая» означает, что положение запятой может «плавать», то есть меняться, чтобы представить как очень маленькие, так и очень большие числа.

Главные герои

  • float – Обычная мензурка. Благодаря небольшой точности (~6-9 знаков) занимает мало памяти.
  • double – Большая точная колба. Высокая точность (~15-17 знаков), но занимает вдвое больше памяти, чем float.
  • decimal — Финансовые электронные весы. Самая высокая точность (~28-29 знаков), исключает ошибки округления. Чаще всего используется для денежных расчетов, где важна каждая копейка.

Советы по выбору. Если хочешь просто дробное число – выбирай double. Если работаешь с деньгами – используй decimal, чтобы избежать ошибок округления. Если нужно сэкономить память в массиве из миллиона чисел – обрати внимание на float.

double distance = 1234.567; // Расстояние (по умолчанию double)
decimal accountBalance = 1500.75m; // Баланс счета (деньги!)
float engineEfficiency = 0.85f; // КПД двигателя (с суффиксом f)

Рассмотрим основные операции, которые можно выполнять над числами с плавающей запятой.

Арифметические: +, -, *, /, %, ++, --

double a = 5.5, b = 2.0;
Console.WriteLine(a + b);  // 7.5
Console.WriteLine(a / b);  // 2.75
Console.WriteLine(a % b);  // 1.5
a++; // 6.5

Сравнение: ==, !=, >, <, >=, <=

double x = 3.14, y = 2.71;
Console.WriteLine(x == y); // False
Console.WriteLine(x > y);  // True
Console.WriteLine(x <= 3.14); // True

Специальные математические функции:

double num = 4.0;
Console.WriteLine(Math.Sqrt(num));  // 2.0 (квадратный корень)
Console.WriteLine(Math.Round(3.14159, 2)); // 3.14 (округление)
Console.WriteLine(Math.Abs(-5.5));  // 5.5 (модуль)

Логический тип

bool – это тип данных для ответа “Да” или “Нет”. Принимает только два значения:

  • true – “Да”, “Истина”, “Включено”, “Присутствует”
  • false — “Нет”, “Ложь”, “Выключено”, “Отсутствует”

Представьте себе выключатель света: он либо включен (true), либо выключен (false). Третьего не дано.

Логический тип используется для ответа на вопросы, которые требуют ответа “Да” или “Нет”:

  • Включен ли свет?
  • Куплен ли билет?
  • Есть ли новое сообщение?
  • Играет ли сейчас музыка?
bool isLightOn = true;    // Свет включен? - Да
bool isTaskCompleted = false; // Задача выполнена? - Нет
bool hasDiscount = true;  // Есть скидка? - Да

Основной сценарий использования bool – в условных выражениях (if). Программа принимает решения на основе этих значений. Подробнее об условных выражениях поговорим в следующей статье, а пока запомните, что в зависимости от логического значения можно выполнять разные инструкции.

bool isUserLoggedIn = true;

if (isUserLoggedIn) // Если (isUserLoggedIn == true)...
{
    Console.WriteLine("Показываем личный кабинет!");
}
else
{
    Console.WriteLine("Показываем форму входа!");
}
// На экране: "Показываем личный кабинет!"

Чаще всего bool получается в результате проверки условия.

int age = 25;

// Задаем вопросы и получаем ответ true/false
bool isAdult = age >= 18;     // true (25 >= 18 -> ДА)
bool isSenior = age > 65;     // false (25 > 65 -> НЕТ)
bool isTwentyFive = age == 25; // true (25 == 25 -> ДА)

Console.WriteLine(isAdult); // Выведет: True

Для закрепления, bool – это простейший “переключатель” с двумя состояниями, который помогает программе принимать решения. Вся логика работы программ построена на этом типе. true – Да, false – Нет.

Символьный тип

char – это тип для хранения одного символа. Буквы, цифры, знаки препинания, смайлы – все что угодно, но только один символ. Представьте себе ячейку для одной буквы в кроссворде. В одну ячейку можно вписать только один символ.

Пишется в одинарных кавычках ' ', в отличие от строк, которые в двойных " " (о них чуть дальше). Объявление переменной в коде выглядит следующим образом:

char grade = 'A';        // Оценка - латинская буква
char digit = '7';        // Цифра (но как символ!)
char symbol = '!';       // Знак препинания
char russianLetter = 'Б'; // Русская буква
char heart = '❤';        // Символ эмодзи

// Важно! Цифра в кавычках — это не число, а символ
char symbol = '5'; // Это символ "пятерка"
int number = 5;    // Это число 5

Переменные типа char можно проверять и преобразовывать:

char input = 'A';

bool isLetter = char.IsLetter(input);     // true - это буква?
bool isDigit = char.IsDigit(input);       // false - это цифра?
bool isUpper = char.IsUpper(input);       // true - это заглавная?

char letter = 'a';
char upperLetter = char.ToUpper(letter);  // 'A' - делаем заглавной

Еще один распространенный пример использования char – в условиях:

char operation = '+';

if (operation == '+')
{
    Console.WriteLine("Сложение!");
}
else if (operation == '-')
{
    Console.WriteLine("Вычитание!");
}

Строковый тип

string – это тип данных для работы с текстом. Текстом может быть и одна буква, и слово, и предложение и даже целая книга. Строки хранят любое количество символов и пишутся в двойных кавычках " ".

В коде это выглядит следующим образом:

string name = "Анна";             // Имя
string greeting = "Привет!";      // Приветствие
string emptyString = "";          // Пустая строка
string numberAsText = "123";      // Цифры, но как текст!
string longText = "Это очень длинный текст..."; // Много текста

Строки можно складывать:

string firstName = "Иван";
string lastName = "Петров";
string fullName = firstName + " " + lastName; // "Иван Петров"

Сравнивать:

string password = "secret";
bool isCorrect = password == "secret"; // true - совпадает?

Работать с отдельными символами:

string word = "Кот";
char firstLetter = word[0]; // 'К' - первый символ (индекс 0)
char secondLetter = word[1]; // 'о' - второй символ (индекс 1)

Использовать полезные методы:

string text = "Привет, мир!";

int length = text.Length;          // 12 - длина строки
string upper = text.ToUpper();     // "ПРИВЕТ, МИР!" - верхний регистр
string lower = text.ToLower();     // "привет, мир!" - нижний регистр
bool contains = text.Contains("мир"); // true - содержит подстроку?

string numberAsText = "12";
int number = int.Parse(numberAsText); // 12 - преобразуем строку в число

string – это главный инструмент для работы с текстом:

  • Имена пользователей
  • Сообщения, описания
  • Адреса, email
  • Любые текстовые данные

Практический пример

Давайте попробуем использовать все эти типы данных в настоящей программе.

Прежде всего, нужно создать проект консольного приложения .NET Core в Visual Studio. Если Visual Studio 2022 уже установлена, выполните следующие шаги, чтобы создать новый проект:

  1. Запустите Visual Studio IDE.
  2. Нажмите “Create new project”.
  3. В окне “Create new project”, выберите “Console App (.NET Core)” из списка доступных шаблонов.
  4. Нажмите “Next”.
  5. В окне “Configure your new project”, укажите название и расположение нового проекта.
  6. Нажмите “Next”.
  7. В окне “Additional information”, выберите “.NET 8.0 (Long Term Support)” в качестве фреймворка, который вы хотите использовать.
  8. Нажмите “Create”.

Напишем программу, которая выводит на экран профиль пользователя, используя базовые типы данных. Для этого удалите из файла Program.cs его содержимое и добавьте следующий код:

using System;

class Program
{
    static void Main()
    {
        // 1. STRING - Имя пользователя
        string userName = "Анна";
        Console.WriteLine("Имя: " + userName);

        // 2. INT - Возраст и год рождения
        int userAge = 26;
        int currentYear = 2025;
        int birthYear = currentYear - userAge; // Простое вычисление
        Console.WriteLine("Возраст: " + userAge);
        Console.WriteLine("Год рождения: " + birthYear);

        // 3. DOUBLE - Рост и вес (с дробной частью)
        double height = 1.75; // метры
        double weight = 68.5; // кг
        Console.WriteLine("Рост: " + height + " м");
        Console.WriteLine("Вес: " + weight + " кг");

        // 4. CHAR - Пол (один символ)
        char gender = 'Ж'; // 'М' или 'Ж'
        Console.WriteLine("Пол: " + gender);

        // 5. BOOL - Признаки (да/нет)
        bool hasDriverLicense = true;
        bool hasPets = false;
        Console.WriteLine("Есть водительские права: " + hasDriverLicense);
        Console.WriteLine("Есть домашние животные: " + hasPets);

        // 6. Склеивание строк
        string profileSummary = "Имя - " + userName + ", Возраст - " + userAge;
        Console.WriteLine("Краткая анкета: " + profileSummary);
    }
}

Пример вывода программы:

Имя: Анна
Возраст: 26
Год рождения: 1999
Рост: 1,75 м
Вес: 68,5 кг
Пол: Ж
Есть водительские права: True
Есть домашние животные: False
Краткая анкета: Имя - Анна, Возраст - 26

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

Заключение

Итак, сегодня мы поговорили об одной из базовых тем при изучении любого языка программирования – типах данных. Узнали, как в C# представляются числа, логические значения, символы и строки. Это основа, на которой будут строиться все будущие программы, которые вы создадите. Эти, казалось бы, простые кирпичики – intstringbool и char – это магия, которая позволяет компьютеру понимать ваши идеи. С их помощью вы сможете описывать целые миры: от анкеты пользователя до сложной игровой вселенной. Так что смело стройте свои первые проекты – впереди вас ждет увлекательное путешествие в мир C#! Творите с удовольствием.