Если происходит переполнение, тогда во время выполнения генерируется исключение System.OverflowException
try и catch. Не вдаваясь пока в детали, взгляните на следующий модифицированный код:static void ProcessBytes
{
byte b1 = 100;
byte b2 = 250;
// На этот раз сообщить компилятору о необходимости добавления
// кода CIL, необходимого для генерации исключения, если возникает
// переполнение или потеря значимости.
try
{
byte sum = checked((byte)Add(b1, b2));
Console.WriteLine("sum = {0}", sum);
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
}
Обратите внимание, что возвращаемое значение метода Add
checked. Поскольку значение sum выходит за пределы допустимого диапазона для типа byte, генерируется исключение времени выполнения. Сообщение об ошибке выводится посредством свойства Message:Arithmetic operation resulted in an overflow.
Чтобы обеспечить принудительную проверку переполнения для целого блока операторов, контекст checked
try
{
checked
{
byte sum = (byte)Add(b1, b2);
Console.WriteLine("sum = {0}", sum);
}
}
catch (OverflowException ex)
{
Console.WriteLine(ex.Message);
}
В любом случае интересующий код будет автоматически оцениваться на предмет возможных условий переполнения, и если они обнаружатся, то сгенерируется исключение, связанное с переполнением.
Настройка проверки переполнения на уровне проекта
Если создается приложение, в котором никогда не должно возникать молчаливое переполнение, то может обнаружиться, что в контекст ключевого слова checked
/checked. Когда он указан, все присутствующие в коде арифметические операции будут оцениваться на предмет переполнения, не требуя применения ключевого слова checked. Если переполнение было обнаружено, тогда сгенерируется исключение времени выполнения. Чтобы установить его для всего проекта, добавьте в файл проекта следующий код:
Настройка проверки переполнения на уровне проекта (Visual Studio)
Для активизации флага /checked
/checked можно отключить для последующих построений (что приведет к увеличению производительности приложения).На заметку!
Если вы не выберете в списке вариант All Configurations, тогда настройка будет применена только к конфигурации, выбранной в текущий момент (т.е Debug (Отладка) или Release (Выпуск)).Использование ключевого слова unchecked
А теперь предположим, что проверка переполнения и потери значимости включена в масштабах проекта, но есть блок кода, в котором потеря данных
/checked распространяется на всю арифметическую логику, в языке C# имеется ключевое слово unchecked, которое предназначено для отмены генерации исключений, связанных с переполнением, в отдельных случаях. Ключевое слово unchecked используется аналогично checked, т.е. его можно применять как к единственному оператору, так и к блоку операторов:// Предполагая, что флаг /checked активизирован, этот блок
// не будет генерировать исключение времени выполнения.
unchecked
{
byte sum = (byte)(b1 + b2);
Console.WriteLine("sum = {0} ", sum);
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT