У нас остались еще нерассмотренными две операции высшего приоритета - checked и unchecked. Начну с определения. Блок или выражение называется проверяемым (непроверяемым), если ему предшествует ключевое слово checked (unchecked). В проверяемых блоках контролируется вычисление арифметических операций и возникает исключительная ситуация, если, например, при вычислениях происходит переполнение разрядной сетки числа. В непроверяемых блоках такая исключительная ситуация будет проигнорирована, и вычисления продолжатся с неверным результатом.
Если в предыдущем примере с байтами все вычисления были корректны, то теперь результат вычисления b3 просто не верен. При сложении был потерян старший разряд со значением 256, и b3 вместо 300 получит значение 44 из диапазона, допустимого для типа byte. Плохо, когда при выполнении программы возникает исключительная ситуация и программа не может далее нормально выполняться. Но еще хуже, когда программа завершает свою работу, выдавая неправильные результаты. Ложь хуже отказа. Кто виноват в возникшей ситуации? Программист, поскольку именно он разрешил опасную операцию, не позаботился о ее контроле и обработке исключительной ситуации в случае ее возникновения. Программист должен знать, что по умолчанию вычисления выполняются в режиме unchecked. А потому, если нет полной уверенности в возможности проведения преобразования, запись опасных преобразований должна сопровождаться введением проверяемых выражений, охраняемых блоков и сопровождающих их обработчиков исключительных ситуаций. Вот как может выглядеть корректно построенный код:
public void Days(){ byte hotDays = 0, coldDays = 0, hotAndCold = 0; const string HOW_HOT = "Сколько жарких дней в этом году? (выше +25 градусов)"; const string HOW_COLD = "Сколько холодных дней в этом году? (ниже -25 градусов)"; const string HOW_HOT_AND_COLD = "В этом году жарких и холодных дней было "; const string MESSAGE_ERROR = "Данные не соответствуют типу в методе Days!"; try { Console.WriteLine(HOW_HOT); hotDays = byte.Parse(Console.ReadLine()); Console.WriteLine(HOW_COLD); coldDays = byte.Parse(Console.ReadLine()); hotAndCold = checked((byte)(hotDays + coldDays)); Console.WriteLine(HOW_HOT_AND_COLD + hotAndCold.ToString()); } catch (OverflowException) { Console.WriteLine(MESSAGE_ERROR); }}
В нормальной ситуации типа byte достаточно для задания числа дней в году, температура которых превосходит средние значения. Но данные вводит пользователь, он может ошибаться, он может вводить данные для Северного или Южного полюса. Поэтому все преобразования помещены в охраняемый блок, вычисления суммарного числа дней помещены в проверяемый блок, предусмотрен обработчик исключительной ситуации.