Иногда случаются ситуации, когда значение переменной одного типа нужно записать в переменную другого типа в эти моменты нужно использовать преобразование типов (кастинг).
Кастинг (casting) – это преобразование значения переменной одного типа в значение другого типа.
Но нужно заметить, что в С# также существует понятие привидения типов (cast) и не нужно их путать, ведь даже если они в коде будут выглядеть одинаково, но их значения разное. (приведение типов будет рассматриваться при работе с классами и структурами)
Преобразование бывает двух видов:
- явный кастинг (explicit) – его также называют небезопасным преобразованием – при использовании явного кастинга преобразования выполняются только в случае явного указания (в круглых, скобках) типа, в который необходимо преобразовать.
- неявный кастинг (implicit) – его также называют безопасным преобразованием – при использовании неявного кастинга преобразования выполняются автоматически без потери точности и урезания части исходного значения числа.
Ниже наведён процесс использования явного кастинга во время записи значения переменной a
типа short
в переменную b
типа byte
. В переменную a
изначально записано значение 256 (для записи которого нужно 9 бит) и при попытке записать данное значение в переменную b
произойдёт урезание исходного значения числа и в b запишется 0 (первые 8 бит переменной a
).
Ниже наведён процесс использования неявного кастинга во время записи значения переменной a
типа byte
в переменную b
типа short
. В переменную a
изначально записано значение 10 и при попытке записать данное значение в переменную b
урезания числа и потери точности не будет.
Примеры явного и неявного преобразования:
// Неявное преобразование значения типа - byte в тип int. (преобразование меньшего типа в больший)
byte a = 10; // 0000 1010 - 1 байт
int b = 0; // 0000 0000 0000 0000 0000 0000 0000 0000 - 4 байта
b = a; // 0000 0000 0000 0000 0000 0000 0000 1010 - 4 байта
Console.WriteLine(b);
// Неявное преобразование значения типа - int в тип float. (преобразование целого типа в вещественный)
int c = 255;
float d = 0f;
d = c;
Console.WriteLine(d);
// Явное преобразование значения типа - int в тип byte.
// (преобразование большего типа в меньший, приводит к потере части результата)
int e = 256; // 0000 0000 0000 0000 0000 0001 0000 0000 - 4 байта
byte f = 0; // 0000 0000 - 1 байт
f = (byte)e; // 0000 0000 - 1 байт
// f = e; // ОШИБКА.
Console.WriteLine(f);
// Явное преобразование значения типа - float в тип int.
// (преобразование вещественного типа в целый, приводит к потере точности результата)
float g = 10.5F;
int h = 0;
h = (int)g;
// h = g; // ОШИБКА.
Также преобразовать числовое значение одного типа в другой можно с помощью использования методов объекта Convert
, название которых начинается с To...
и заканчивается системным названием типа к которому нужно преобразовать. Например:
byte a = Convert.ToByte(1.1); // преобразует вещественное значение в тип byte
double b = Convert.ToDouble(2); // преобразует целочисленное значение в вещественное (в тип double)
Кроме этого данные методы позволяют строку (если она представляет числовое значение) преобразовать к нужному числовому типу, но нужно быть с этим осторожным ведь при присутствии в строки символов несовместимых с числами (например, буквы), то будет ошибка при попытке преобразования. Такой же возможностью обладает и метод Parse
существующий у каждого числового типа.
byte a = Convert.ToByte("1");
double b = Convert.ToDouble("2222");
a = Byte.Parse("27");
b = double.Parse("12,22");
b = double.Parse("-12sdaf,22"); // будет ошибка
Источник: видеоурок Александра Шевчука "ВИДЕОУРОК №3. ПЕРЕМЕННЫЕ И ТИПЫ ДАННЫХ"