4

Преобразование типов

Из этой лекции вы узнаете, об особенностях применения неявного типа var и о преобразовании типов данных.

Начнем эту лекцию с написания программы подсчета населения двух стран Индии и Китая. Для инициализации переменных будем использовать неявный тип данных — var, который не рекомендуется применять на начальном этапе обучения.

Неявный тип данных var — это операция, при которой тип данных переменной назначается по формату записи значения. Это свойство не позволяет объявить переменную, поэтому переменная с типом данных var инициализируется.

Напомним соответствие формата записи и типа данных. Значения, состоящего из цифр —тип данных int, для чисел с точкой— double, набор любых символов заключенных в двойные кавычки — string.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = 328;

Console.WriteLine(text + number + " метров");

}

Применение var удобно, но в процессе написания кода, во избежание непредсказуемых результатом из-за несовместимости различных типов данных, необходимо контролировать тип данных у переменных.

Для определения типа данных у переменной применяется метод GetType(), который  выводит на экран тип данных с классом которому принадлежит этот тип, и его аналог GetTypeCode(), который показывает тип данных без принадлежности к классу. Для просмотра типа данных достаточно поставить точку после переменной и написать имя метода, точечная нотация. Не забываем формат метода — две круглые скобки в конце названия.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = 328;

Console.WriteLine(text + number + " метров");

Console.WriteLine("Тип данных text- " + text.GetTypeCode());

Console.WriteLine("Тип данных number- " + number.GetTypeCode());

}

В этой программе есть один недостаток, а именно переменной number, которой VS автоматически назначила тип данных int, что создает не нужную нагрузку на аппаратную часть. Здесь больше подойдет тип данных ushort.

Так как тип данных var определяет назначаемый тип по присваиваемому значению, то достаточно явно изменить тип этого значения.

static void Main(string[] args)

{

var text = "Высота Эйфелевой башни ";

var number = (ushort)328;

Console.WriteLine(text + number + " метров");

Console.WriteLine("Тип данных text- " + text.GetTypeCode());

Console.WriteLine("Тип данных number- " + number.GetTypeCode());

}

Операция по явному изменению типа данных называется — явное привидение типов или преобразование типов.

С помощью преобразования типов вы можете изменять значения переменных. К примеру, если нет необходимости в дробной части. Программа для определения средней температуры.

static void Main(string[] args)

{

var day1 = -3.1;

var day2 = 1.2;

var day3 = 5.5;

var result = (int) ((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

}

Или снизить разрядность переменной с 32 ячеек до 8.

static void Main(string[] args)

{

var day1 = -3.1;

var day2 = 1.2;

var day3 = 5.5;

var result = (byte)((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

Console.WriteLine("Тип данных: " + result.GetTypeCode());

}

Преобразование типов участвует не только в операциях с типом var, но и с другими типами. Та же самая программа с явными типами данных.

static void Main(string[] args)

{

double day1 = -3.1;

double day2 = 1.2;

double day3 = 5.5;

byte result = (byte)((day1 + day2 + day3) / 3);

Console.WriteLine("Средняя температура: " + result);

Console.WriteLine("Тип данных: " + result.GetTypeCode());

}

Еще одно применение преобразование нашло в учебном вводе с клавиатуры. Почему в учебном расскажем ниже

Для ввода информации будем использовать метод ReadLine. Вызов метода аналогичен вызову метода WriteLine. По правилам хорошего тона, перед вводом, пишется строка приглашение, иначе как понять мигающий курсор.

static void Main(string[] args)

{

Console.WriteLine("Введите Ваш текст. По окончанию нажмите enter");

string text = Console.ReadLine();

Console.Clear();

Console.WriteLine("Вы ввели следующий текст: " + text);

}

Поздравляем! Вы создали первую диалоговую программу, а Пользователь получил в свое распоряжение программный интерфейс для управления ходом вычислений.

Перезапустим программу и сделаем немыслимое — введем числовое значение, которым будет инициализирована переменная с типом данных string. Но ошибки не последовало, и программа вывела на экран число.

Возникает вопрос, как числовое значение поместилось в область памяти, предназначенное для строковых значений. Ответ - никак. Метод Console.ReadLine(); принимает на вход набор символов. Введённое нами число было принято, как строка и передано в строковую переменную как строка, и на экране мы видим не число, но слово (строку) в виде числа.

Для инициализации переменной типом данных отличным от типа данных string требуется явное преобразование типа данных.

Сразу предупредим, что приведенный ниже код обладает существенным недостатком, а именно существует вероятность получения с клавиатуры значения, формат которого отличен от формата инициализируемой переменной, что в свою очередь приведет к ошибке.  

Попробуйте инициализировать переменную с типом данных int, значением, содержащим символ отличным от цифры, а метод Console.ReadLine() именно инициализирует строку вводимым значением. К ошибке приведет даже неверный выбор точки или запятой в значении переменной с типом данных double.

Поэтому такой ввод числового значения хорош только в учебных целях и в реальной программе его использование не допустимо, потому что пользователь в данном случае имеет возможность ввести не соответствующий формат значения для инициализируемой переменной. Т.е. там, где ожидается ввод числа пользователь может ввести отличные от цифр символы, и компилятор или интерпретатор попытается записать в переменную с примитивным типом данных значение ссылочного типа.

Преобразуем строку состоящую из цифр в полноценное числовое значение

static void Main(string[] args)

{

Console.WriteLine("Введите число");

int number = int.Parse(Console.ReadLine());

Console.Clear();

Console.WriteLine("Вы ввели число: " + number);

}

Для преобразования типа данных используется следующая конструкция преобразования типа данных string в тип данных int— int.Parse(Console.ReadLine()). Для byte, соответственно это будет byte.Parse(), для short — short.Parse() и т.д.  

Пример программы с различными типами данных

static void Main(string[] args)

{

Console.WriteLine("Введите ваше имя. Нажмите enter");

string text = Console.ReadLine();

Console.WriteLine("Введите ваш возраст. Нажмите enter");

int numberInt = int.Parse(Console.ReadLine());

Console.WriteLine("Введите число Pi до 5 знака после запятой. Нажмите enter");

double numberDouble = double.Parse(Console.ReadLine());

Console.Clear();

Console.WriteLine("Ваше имя: " + text);

Console.WriteLine("Ваш возраст: " + numberInt);

Console.WriteLine("Число Pi: " + numberDouble);

}

В заключении.

Неявное преобразование(приведение) типов данных может приводить к непредсказуемым результатам. Примите за правило, в процессе обучения, явно указывать типы данных у переменных.

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!