Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Приведение несовместимых типов

Поиск

 

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

 

(<целевой тип>) <выражение>

 

Здесь целевои тип обозначает тот тип, в который желательно преобразовать указанное выражение.

Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Например, в результате приведения типа long к типу int часть информации потеряется, если значение типа long окажется больше диапазона представления чисел для типа int, поскольку старшие разряды этого числового значения отбрасываются. Когда же значение с плавающей точкой приводится к целочисленному, то в результате усечения теряется дробная часть этого числового значения. Так, если присвоить значение 1,23 целочисленной переменной, то в результате в ней останется лишь целая часть исходного числа (1), а дробная его часть (0,23) будет потеряна. Давайте рассмотрим пример:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

int i1 = 455, i2 = 84500;

decimal dec = 7.98845m;

// Приводим два числа типа int

// к типу short

Console.WriteLine((short)i1);

Console.WriteLine((short)i2);

// Приводим чило типа decimal

// к типу int

Console.WriteLine((int)dec);

Console.WriteLine("Для продолжения нажмите любую клавишу... ");

Console.ReadKey();

}

}

}

/* Выведет:

* 477

* 18964

* 7

* Для продолжения нажмите любую клавишу...

*/

 

Обратим внимание, что переменная i1 корректно преобразовалась в тип short, т.к. её значение входит в диапазон этого типа данных. Преобразование переменной dec в тип int вернуло целую часть этого числа. Преобразование переменной i2 вернуло значение переполнения 18964 (т.е. 84500 - 2*32767).

6. Перехват сужающих преобразований данных

 

В предыдущем примере приведение переменной i2 к типу short не является приемлемым, т.к. возникает потеря данных. Для создания приложений, в которых потеря данных должна быть недопустимой, в С# предлагаются такие ключевые слова, как checked и unchecked, которые позволяют гарантировать, что потеря данных не окажется незамеченной.

По умолчанию, в случае, когда не предпринимается никаких соответствующих исправительных мер, условия переполнения (overflow) и потери значимости (underflow) происходят без выдачи ошибки. Обрабатывать условия переполнения и потери значимости в приложении можно двумя способами. Это можно делать вручную, полагаясь на свои знания и навыки в области программирования.

Недостаток такого подхода в том, что даже в случае приложения максимальных усилий человек все равно остается человеком, и какие-то ошибки могут ускользнуть от его глаз.

К счастью, в С# предусмотрено ключевое слово checked. Если оператор (или блок операторов) заключен в контекст checked, компилятор С# генерирует дополнительные CIL-инструкции, обеспечивающие проверку на предмет условий переполнения, которые могут возникать в результате сложения, умножения, вычитания или деления двух числовых типов данных.

В случае возникновения условия переполнения во время выполнения будет генерироваться исключение System.OverflowException. Давайте рассмотрим пример, в котором будем передавать в консоль значение исключения:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

byte var1 = 250;

byte var2 = 150;

try

{

byte sum = checked((byte)(var1 + var2));

Console.WriteLine("Сумма: {0}", sum);

Console.WriteLine("Для продолжения нажмите любую клавишу... ");

}

catch (OverflowException ex)

{

Console.WriteLine(ex.Message);

Console.WriteLine("Для продолжения нажмите любую клавишу... ");

Console.ReadKey();

}

}

}

}

/* Выведет:

* Переполнение в результате выполнения арифметической операции.

* Для продолжения нажмите любую клавишу...

*/



Поделиться:


Последнее изменение этой страницы: 2016-12-28; просмотров: 231; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.254.229 (0.005 с.)