Явное и неявное преобразование в c#

Явное и неявное преобразование в 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#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *