Преобразование типов в C#
Преобразование типов в C#: неявное и явное приведение, Convert, Parse, TryParse — как переводить данные из одного типа в другой.
Преобразование типов — превращение значения одного типа данных в другой. C# строго типизирован, поэтому смешивать несовместимые типы напрямую нельзя — нужно явно указать, как конвертировать.
Неявное преобразование
Когда новый тип «шире» исходного, C# конвертирует автоматически — без потери данных:
int a = 42;
long b = a; // int → long: автоматически
double c = a; // int → double: автоматически
Console.WriteLine(b);
Console.WriteLine(c);
Вывод:
42 42
Из | Автоматически в |
|
|
|
|
|
|
Явное приведение (casting)
Когда данные могут потеряться (широкий тип → узкий), нужно явно указать тип в скобках:
double pi = 3.14159;
int n = (int)pi; // дробная часть отбрасывается!
Console.WriteLine(n); // 3
long bigNum = 300;
byte small = (byte)bigNum; // 300 не влезает в byte (0..255) — данные портятся!
Console.WriteLine(small); // 44 (300 % 256)
Вывод:
3 44
Явное приведение не проверяет переполнение — данные могут молча исказиться. Убедитесь, что значение умещается в целевой тип.
Класс Convert
Convert удобен для преобразований «через» тип, особенно из строки:
string s = "123";
int n = Convert.ToInt32(s);
double d = Convert.ToDouble("3.14");
bool flag = Convert.ToBoolean(1); // true
Console.WriteLine(n + 1); // 124
Console.WriteLine(d * 2); // 6.28
Console.WriteLine(flag); // True
Вывод:
124 6.28 True
Parse и TryParse
Parse преобразует строку в число, но бросает исключение, если строка не является числом. TryParse безопаснее — возвращает false вместо исключения:
// Parse — может выбросить FormatException
int x = int.Parse("42");
Console.WriteLine(x); // 42
// TryParse — безопасная версия
string input = "abc";
bool ok = int.TryParse(input, out int result);
Console.WriteLine(ok); // False
Console.WriteLine(result); // 0 (значение по умолчанию)
Вывод:
42 False 0
Правило: используйте
TryParse, когда строка приходит от пользователя или из файла — она может быть некорректной.
Nullable-типы
Обычный int не может хранить «ничего». Nullable-тип int? может принять null — это удобно для данных из базы или ввода пользователя:
int? age = null; // ещё не введено
Console.WriteLine(age.HasValue); // False
age = 25;
Console.WriteLine(age.HasValue); // True
Console.WriteLine(age.Value); // 25
// Оператор ?? — «взять значение или запасное»
int realAge = age ?? 0;
Console.WriteLine(realAge); // 25
Вывод:
False True 25 25
Коротко
- Неявное преобразование — автоматически, когда новый тип «шире» (нет потери данных).
- Явное приведение
(тип)значение— когда данные могут потеряться; ответственность на программисте. Convert.ToXxx— универсальный конвертер, в том числе из строки.Parse— строку в число; бросает исключение при ошибке.TryParse— безопасная версия, возвращаетbool.int?— nullable-тип; хранит значение илиnull; оператор??задаёт значение по умолчанию.