Явное и неявное преобразование в c#
Всем доброго времени суток, на связи Алексей Гулынин. В прошлой статье мы узнали, что такое .NET Framework. В данной статье я бы хотел поговорить про явное и неявное преобразование в C#. C# является строго типизированным языком. Тип переменной нужно указывать при её инициализации. Иногда возникает необходимость преобразовать переменную в другой тип. В C# существует явное и неявное преобразование типов (implicitly convert). Неявное преобразование характерно, в основном, для числовых типов: byte, short, int, long, float, double. Как это понимать? Тип данных byte неявно преобразовывается в типы данных short, int ,long. Тип данных short неявно преобразовывается в типы данных int, long. Int неявно преобразовывается в long, float неявно преобразовывается в double. А в double вообще все эти типы неявно преобразовываются.
Давайте на примере разберем неявное преобразование типов:
static void Main(string[] args)
{
byte b = 5;
short s = b;
int i = b;
long l = b;
//Пробуем преобразовать long в double
double d = l;
Console.WriteLine("Short = {0}, Int = {1}, Long = {2}, Double = {3}", s, i, l, d);
Console.ReadLine();
}
Почему такое преобразование возможно. Ответ кроется в том, что диапазон значений long перекрывает int (т.е. в long можно записать значение любого int), диапазон значений short перекрывает byte и т.д.
Здесь мы видим, что преобразование прошло и сообщения выводятся. Однако обратное преобразование не работает, т.е. long неявно не преобразовывается в int, short в byte и т.д. При попытке выполнить такое преобразование компилятор поругается:
static void Main(string[] args)
{
short s = 45;
//Компилятор выдаст вот такую ошибку:
//Cannot implicitly convert type 'short' to 'byte'. An explicit conversion exists (are you missing a cast?)
byte b = s;
Console.WriteLine("Short = {0}", s);
Console.ReadLine();
}
Компилятор говорит, "что неявное преобразование short в byte невозможно. Явное преобразование существует (вы пропустили cast?)". На этапе компиляции компилятор не знает, какое значение будет храниться в переменных b (типа byte) и s (типа short), а не всякое число типа short можно положить в byte. Можно написать такое значение short, которое не влезет в byte.
Поэтому и выходит ошибка на этапе компиляции.
С неявным преобразованием типов мы разобрались, давайте теперь поговорим про явное преобразование. Оператор, который делает это называется cast: в круглых скобках перед переменной указывается тип данных, к которому эта переменная должна преобразовывается. Пример:
static void Main(string[] args)
{
short s = 45;
byte b = (byte)s;
Console.WriteLine("Byte = {0}", b);
Console.ReadLine();
}
Существует ещё один способ преобразования данных с помощью класса Convert, в котором есть много статических методов (с префиксом To). Данные статические методы выполняют преобразования. Переделаем предыдущий пример:
static void Main(string[] args)
{
short s = 45;
byte b = Convert.ToByte(s);
Console.WriteLine("Byte = {0}", b);
long l = 1234;
int i = Convert.ToInt32(l);
Console.WriteLine("Int = {0}", i);
Console.ReadLine();
}
Здесь я добавил преобразование long в int. Тут есть несколько статических методов: ToInt16(), ToInt32(), ToInt64(). Разберем, что значат эти цифры на примере метода ToInt32. Тип данных int занимает 4 байта (нам и нужно для хранения этой переменной 4 байта), а это 32 бита (4 байта * 8(в одном байте 8 битов) = 32 бита).
Также отмечу, что существует универсальный метод ToString(), который любой тип данных переводит в строку. А что если мы хотим строку перевести в число? Это требуется тогда, когда пользователь что-то вводит. Здесь поможет метод Parse. Рассмотрим на примере:
static void Main(string[] args)
{
Console.Write("Введите число: ");
string str = Console.ReadLine();
int i = int.Parse(str);
Console.WriteLine("Вы ввели число {0}", i);
Console.ReadLine();
}
Всё хорошо, но если пользователь введёт не число, а какую-нибудь ерунду, то программа аварийно завершится. Чтобы этого не произошло воспользуемся методом TryParse(). Данный метод проверяет возможно ли выполнить преобразование, и если возможно, то возвращает истину. Переделаем наш код:
static void Main(string[] args)
{
Console.Write("Введите число: ");
string str = Console.ReadLine();
int i;
if (int.TryParse(str, out i)) Console.WriteLine("Вы ввели число {0}", i);
else Console.WriteLine("Вы ввели число не число");
Console.ReadLine();
}
В качестве домашнего задание реализуйте такой алгоритм: выводить сообщение пользователю «Введите целое число» до тех пор пока он не введёт целое число. Другими словами, если он ввёл не целое число, то программа не должна завершаться и сообщение должно снова появляться.
В данной статье вы узнали, что такое конструкторы в C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




