Программирование >>  Программирование с использованием ajax 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 396


Это приведет к получению следующего результата:

значение sourceVar: 281 значение destinationVar: 25

Почему результат стал выглядеть так? Чтобы понять это, давайте посмотрим на двоичные представления двух данных чисел, а также максимального значения, которое может сохраняться в переменной типа byte - число 255:

281 = 100011001 25 = 000011001 255 = 0111Ц111

Здесь видно, что произошла потеря левого крайнего бита исходных данных. Сразу же возникает вопрос о том, как узнать, когда такое будет происходить. Очевидно, что случаи, когда нужно явно приводить один тип к другому, обязательно будут встречаться, и потому не помешало бы заранее знать о том, не вызовет ли это приведение потерю каких-то данных. В противном случае возможны очень серьезные ошибки, особенно в приложениях вроде бухгалтерского учета или вычисления траектория полета ракеты на Луну.

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

Для установки так называемого контекста проверки на предмет переполнения для выражения предусмотрены два ключевых слова: checked и unchecked. Применяются они следующим образом:

checked[выражение) unchecked{выражение)

В последнем примере обеспечить принудительное выполнение проверки на предмет переполнения можно так:

byte destinationVar; short sourceVar = 281;

destinationVar = checked((byte)sourceVar);

Console.WriteLine( значение sourceVar: {0} , sourceVar);

Console.WriteLine( значение destinationVar: {0} , destinationVar);

Попытка выполнения этого кода приведет к аварийному завершению и отображению сообщения об ошибке, подобного показанному на рис. 5.1 (которое было получено при компиляции проекта Overf lowCheck).

Если, однако, заменить в этом коде checked на unchecked, то он выдаст точно такой же результат, как и раньше, без сообщений об ошибках. Такое поведение идентично уже продемонстрированному ранее поведению по умолчанию.

С помощью этих двух ключевых слов можно настроить приложение, чтобы оно вело себя так, будто каждое выражение такого типа включает слово checked, если только в этом выражении явно не используется ключевое слово unchecked (другими словами, изменить параметр, используемый для проверки на предмет переполнения по умолчанию). Чтобы сделать это, нужно изменить свойства проекта в VS, щелкнув правой кнопкой мыши на проекте в окне Solution Explorer (Проводник решений), выбрав в контекстном меню пункт Properties (Свойства) и щелкнув на элементе Build (Сборка) в левой части окна. Это приведет к отображению параметров сборки, как показано на рис. 5.2.



Ov rflowCritCk Pi

MMnlltrtngD wgsf

1911.0 Syflceirj ising Syacen.Collections, Л1П0 Syacn.Llnq. laing Зуасева.Техс;

OvertlowCheck

: void H in(


ini[) ro )

byte destinationVac ; short aourccVar - 281:

estin*clonV*r - checked ((byte) eourceVer);; .on-oj. .WriteLine CsourceVai vn I; (Ol , sourceVar) j oii/Oi-.WrlteLine( e-tinai lonVer v l! (0)-, destinationVar);

n ovtmow.

t *vid >q ti/ itfc

Puc. 5.1. Сообщение об ошибке


Рис. 5.2. Параметры сборки

Свойство, которое необходимо изменить, относится к расширенным параметрам, поэтому щелкните на кнопке Advanced (Дополнительно) и в диалоговом окне, которое появится после этого, отметьте флажок Check for arithmetic overflow/underflow (Выполнять проверку на предмет арифметического переполнения/потери значимости), как показано на рис. 5.3. По умолчанию этот флажок не отключен, а его включение обеспечивает описанное выше поведение checked.



Advanced Build SetMifi

Gtnerel - -

language VertioiK

Internal Comptlet Error Rrportirig [prottpt ChecV for arl♦nretlC overflow, underfiovi.

f Do not reference mjcoiiibdil Output

Debug Wo

File Alignment

Dll BaseAddreH

Puc. 5.3. Отштка флажка Check for arithmetic overflow/underflow

Явные преобразования с помощью команд Convert

Операции явного преобразования, которые использовались в различных практических занятиях, немного отличаются от тех, что рассматривались до сих пор в настоящей главе. В частности, они подразумевали преобразование строковых значений в числа с помощью команд вроде Convert. ToDouble (), что явно не является подходом, который будет работать для всех возможных строк.

Попытка, например, преобразовать строку Number в значение типа double с помощью команды Convert. ToDouble () при выполнении кода приведет к отображению диалогового окна, показанного на рис. 5.4.

I ForaMlExteption гм taihandted

Input string was not tn a correct format Tioubl *hoo(ing lips

j \A/hen conwertinij a Jtring to DateTime p *г е the stung to take the date fcefoft putting each vaUabie into tht DateTime obiect 1 Get general hetp for thn ecec-tion Search oi more Help 0 line..

Aftiom; View Detail,.

Copy exception detail to the clipboard

Puc. 5.4. Диалоговое окно с сообщением о недопустимом преобразовании строки в число

Как видно, выполнить подобную операцию не получится. Чтобы такие операции преобразования работали, предоставляемая строка должна обязательно иметь вид допустимого представления числа, и при этом данное число должно быть обязательно таким, которое не будет приводить к переполнению. Допустимым представлением числа считается то, в котором содержится (не обязательно) какой-то знак (плюс или минус), ноль или более цифр, а также, не обязательно, точка, за которой следует еще одна или более цифр, символ е или Е, за которым следует еще какой-то знак и одна или более цифр, и больше ничего, кроме символов пробела (перед и после этой последовательности). В случае использования всех необязательных элементов допустимым представлением числа могут становиться такие сложные строки, как -1.2451е-24.

Существует еще много явных операций преобразования, которые могут задаваться подобным образом, как показано в табл. 5.2.



1 ... 30 31 32 [ 33 ] 34 35 36 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика