Урок 3. Преобразование значений типов (кастинг)

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

Кастинг (casting) – это преобразование значения переменной одного типа в значение другого типа.
Но нужно заметить, что в С# также существует понятие привидения типов (cast) и не нужно их путать, ведь даже если они в коде будут выглядеть одинаково, но их значения разное. (приведение типов будет рассматриваться при работе с классами и структурами)

Преобразование бывает двух видов:

  1. явный кастинг (explicit) – его также называют небезопасным преобразованием – при использовании явного кастинга преобразования выполняются только в случае явного указания (в круглых, скобках) типа, в который необходимо преобразовать.
  2. неявный кастинг (implicit) – его также называют безопасным преобразованием – при использовании неявного кастинга преобразования выполняются автоматически без потери точности и урезания части исходного значения числа.

Ниже наведён процесс использования явного кастинга во время записи значения переменной a типа short в переменную b типа byte. В переменную a изначально записано значение 256 (для записи которого нужно 9 бит) и при попытке записать данное значение в переменную b произойдёт урезание исходного значения числа и в b запишется 0 (первые 8 бит переменной a).

13

Ниже наведён процесс использования неявного кастинга во время записи значения переменной a типа byte в переменную b типа short. В переменную a изначально записано значение 10 и при попытке записать данное значение в переменную b урезания числа и потери точности не будет.

14

Примеры явного и неявного преобразования:

// Неявное преобразование значения типа - 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;         // ОШИБКА.

15

16
Также преобразовать числовое значение одного типа в другой можно с помощью использования методов объекта 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. ПЕРЕМЕННЫЕ И ТИПЫ ДАННЫХ"

%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BB%D0%B5%D0%B2%D0%BE%202 предыдущая статья | следующая статья %D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%202