Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# Лекция_3 Выражения и операции.docx
Скачиваний:
36
Добавлен:
18.12.2018
Размер:
667.21 Кб
Скачать
      1. Проверяемые и непроверяемые блоки и выражения

У нас остались еще нерассмотренными две операции высшего приоритета - checked и unchecked. Начну с определения. Блок или выражение называется проверяемым (непроверяемым), если ему предшествует ключевое слово checked (unchecked). В проверяемых блоках контролируется вычисление арифметических операций и возникает исключительная ситуация, если, например, при вычислениях происходит переполнение разрядной сетки числа. В непроверяемых блоках такая исключительная ситуация будет проигнорирована, и вычисления продолжатся с неверным результатом.

Слегка модифицируем выше приведенный пример:

byte b1 = 100, b2 = 200, b3;

//b3 = b1 + b2;

b3 = (byte)(b1 + b2);

Если в предыдущем примере с байтами все вычисления были корректны, то теперь результат вычисления 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 достаточно для задания числа дней в году, температура которых превосходит средние значения. Но данные вводит пользователь, он может ошибаться, он может вводить данные для Северного или Южного полюса. Поэтому все преобразования помещены в охраняемый блок, вычисления суммарного числа дней помещены в проверяемый блок, предусмотрен обработчик исключительной ситуации.