В C# тип переменной имеет значение: число, строка и логический флаг ведут себя по-разному, а компилятор помогает не смешивать их случайно. В этом уроке мы сделаем маленький расчет заказа: название товара, цена, количество, скидка и итоговая строка для вывода в консоль
На примере разберем int, double, bool, string, var и string interpolation
Что получится в конце
Программа выведет:
Товар: Книга по C#
Количество: 2
Итог: 1700
Скидка применена: True
Код:
var productName = "Книга по C#";
int quantity = 2;
double price = 1000;
double discountPercent = 15;
double subtotal = price * quantity;
double discount = subtotal * discountPercent / 100;
double total = subtotal - discount;
bool hasDiscount = discountPercent > 0;
Console.WriteLine($"Товар: {productName}");
Console.WriteLine($"Количество: {quantity}");
Console.WriteLine($"Итог: {total}");
Console.WriteLine($"Скидка применена: {hasDiscount}");
Создаем проект
dotnet new console -n CSharpTypes
cd CSharpTypes
Откройте Program.cs, замените содержимое кодом из примера и запустите:
dotnet run
Если проект запускается, можно разбирать типы по одному
int, double, bool, string
int хранит целые числа:
int quantity = 2;
double хранит число с дробной частью:
double price = 1000;
double discountPercent = 15;
bool хранит true или false:
bool hasDiscount = discountPercent > 0;
string хранит текст:
string productName = "Книга по C#";
Для первого урока этого набора достаточно. Позже появятся decimal, DateTime, nullable-типы, коллекции и собственные классы
var не делает C# динамическим
Строка:
var productName = "Книга по C#";
не превращает переменную в «что угодно». Компилятор смотрит на значение справа и выводит тип string
То есть такой код не сработает:
var productName = "Книга по C#";
productName = 123;
Переменная уже строка, и число в нее положить нельзя. var экономит запись, но не отменяет строгую типизацию
Когда тип важен для чтения урока, пишите явно. Когда значение очевидно, var нормален
String interpolation
Вместо склеивания строк:
Console.WriteLine("Товар: " + productName);
удобнее писать:
Console.WriteLine($"Товар: {productName}");
Символ $ перед строкой включает интерполяцию. Внутри {...} можно вставлять переменные и выражения:
Console.WriteLine($"Цена за штуку: {price}, всего позиций: {quantity}");
Для учебных и прикладных сообщений это читается сильно лучше, чем длинная цепочка +
Добавляем форматирование суммы
Сейчас total может выводиться слишком просто. Добавим формат:
Console.WriteLine($"Итог: {total:0.00}");
Теперь число будет показано с двумя знаками после точки:
Итог: 1700.00
Для настоящих денег в C# часто используют decimal, но в первом уроке double помогает спокойно разобрать типы и арифметику. Если пишете финансовый код, не переносите учебный double бездумно в production
Ввод из консоли
Добавим имя товара от пользователя:
Console.Write("Введите товар: ");
string? productName = Console.ReadLine();
Console.WriteLine($"Вы выбрали: {productName}");
Почему string?, а не просто string? Console.ReadLine() может вернуть null, если ввод недоступен. Современный C# умеет предупреждать о возможном null, и это не случайная придирка: так язык помогает не получить NullReferenceException позже
Для простого урока можно обработать пустой ввод так:
if (string.IsNullOrWhiteSpace(productName))
{
productName = "Без названия";
}
Частые ошибки
Cannot implicitly convert type 'string' to 'int'. Вы пытаетесь положить строку в числовую переменную. Нужно преобразование или другой тип
Use of unassigned local variable. Переменная объявлена, но не получила значение перед использованием
Неправильная десятичная запятая. В коде дробные числа пишутся с точкой: 10.5, а не 10,5
Nullability warnings после Console.ReadLine. Это предупреждение о возможном null. Проверьте значение перед использованием
Что может быть еще интересно по этой теме
Что лучше: var или явный тип? Для новичка явный тип часто полезнее. В реальном коде var используют там, где тип очевиден из правой части
Почему bool выводится как True, а не true? Это стандартное строковое представление bool в .NET. Для JSON и API правила будут другими
Нужно ли сразу учить все типы C#? Нет. Сначала хватит int, double, bool, string, затем добавятся decimal, DateTime, коллекции и классы
Почему C# ругается до запуска? Потому что компилятор проверяет типы заранее. Это один из главных плюсов языка
Что открыть дальше
- C# с нуля: первый проект через dotnet new — если нужно повторить структуру проекта.
- Классы и свойства в C#: первый пример — следующий шаг после отдельных переменных.
- List, Dictionary и LINQ в C# на живом примере — когда данных станет больше одного объекта.
- Ошибки C#: cannot convert, null reference и missing using — чтобы научиться читать сообщения компилятора.



