Встроенные типы
В прошлом уроке у коробок было две формы: int для целых чисел и string для текста. Программам нужны и другие формы: для цены с копейками, для ответа «да» или «нет», для одной буквы. Для частых случаев в C# есть встроенные типы — типы, которые язык знает сам: у каждого есть своё ключевое слово, например int или bool.
Чаще всего нужны семь встроенных типов:
int apples = 12;
long people = 8100000000;
double distance = 2.5;
decimal price = 19.99m;
bool isOpen = true;
char grade = 'A';
string city = "Kazan";
Console.WriteLine(apples); // 12
Console.WriteLine(people); // 8100000000
Console.WriteLine(distance); // 2.5
Console.WriteLine(price); // 19.99
Console.WriteLine(isOpen); // True
Console.WriteLine(grade); // A
Console.WriteLine(city); // KazanКаждая переменная — коробка своей формы. Давайте разберём типы по группам.
Целые числа
int
int хранит целые числа от минус двух до плюс двух миллиардов с небольшим. Точные границы можно напечатать: их хранят int.MinValue и int.MaxValue.
Console.WriteLine(int.MinValue); // -2147483648
Console.WriteLine(int.MaxValue); // 2147483647Для счётчиков, возрастов и количеств почти всегда берут int.
long
long вмещает числа до 9223372036854775807 — это 19 цифр. Он нужен, когда двух миллиардов мало: население Земли, время в миллисекундах. Чтобы и небольшое число в коде считалось long, к нему дописывают суффикс L: 5L.
Здесь аналогии с формой коробки не хватает: у типа есть ещё и предел. Число 8100000000 целое, но в коробку int не войдёт, поэтому население Земли хранят в long.
Дробные числа
double
Число с точкой, например 2.5, в C# имеет тип double. Дробную часть в коде всегда отделяют точкой, а не запятой. double подходит для измерений: расстояния, веса, температуры.
Целое и дробное — разные формы коробок. Строка int price = 9.99; не скомпилируется: компилятор не отрезает дробную часть молча и сообщает об ошибке CS0266.
Комментарии в примерах показывают вывод на компьютере с английскими региональными настройками. Если в системе выбран русский формат чисел, первая программа урока напечатает 2,5 и 19,99: при печати программа отделяет дробную часть так, как задано в настройках компьютера. В коде точка остаётся точкой.
decimal
decimal хранит до 28–29 значащих цифр, а дробную часть держит десятичными цифрами, как в чеке. Поэтому цены и суммы денег хранят в decimal. Число для него пишут с суффиксом m: 19.99m.
Логический тип, символ и строка
bool
bool хранит ответ «да» или «нет»: true или false. Console.WriteLine печатает эти значения с заглавной буквы: True и False.
char
char хранит ровно один символ. В коде его пишут в одинарных кавычках: 'A', '7', '?'. 'A' и "A" — разные значения: первое — символ, второе — строка из одного символа.
string
string хранит текст любой длины, даже пустой. В коде его пишут в двойных кавычках: "Kazan", "".
Строка плюс число
Знак + между строкой и значением другого типа склеивает их в одну строку. Значение превращается в текст и приклеивается к строке:
int apples = 12;
string text = "Apples: " + apples;
Console.WriteLine(text); // Apples: 12
Console.WriteLine("Open: " + true); // Open: True
Console.WriteLine("Sum: " + 2 + 3); // Sum: 23Разберём последнюю строку. + выполняется слева направо, поэтому к строке "Sum: " сначала приклеивается 2, а потом 3. Получается текст Sum: 23, а не сумма 5.
Значимые типы
int, long, double, decimal, bool и char — значимые типы. Переменная такого типа хранит само значение, поэтому присваивание копирует его целиком: после b = a у каждой переменной своя копия. string в этот список не входит, но и строки после b = a живут отдельно: a = "Oslo" не меняет b.
Частая ошибка
Цену объявили как decimal, а суффикс m забыли:
decimal price = 19.99; // ✗
Console.WriteLine(price);error CS0664: Literal of type double cannot be implicitly converted to type 'decimal'; use an 'M' suffix to create a literal of this typeПрограмма не компилируется. Число с точкой без суффикса — это double, и в коробку decimal его без явной пометки не кладут. Компилятор сам подсказывает решение: допишите m, и получится 19.99m.
Главное
- Целые числа хранят в
int(около ±2 миллиардов) иlong(19 цифр), дробные — вdoubleиdecimal. - Деньги хранят в
decimal, и число для него пишут с суффиксомm:19.99m. boolхранитtrueилиfalseи печатается с заглавной буквы;char— один символ в одинарных кавычках,string— текст в двойных."Sum: " + 2 + 3даётSum: 23:+со строкой склеивает текст слева направо.