|
Программирование >> Программирование с использованием ajax
Это приведет к получению следующего результата: значение 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
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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |