Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Страница 65
Для обработки условий переполнения и потери значимости в приложении доступны два способа. Это можно делать вручную, полагаясь на свои знания и навыки в области программирования. Недостаток такого подхода произрастает из того факта, что мы всего лишь люди, и даже приложив максимум усилий, все равно можем попросту упустить из виду какие-то ошибки.
К счастью, язык C# предоставляет ключевое слово
checked
checked
Если происходит переполнение, тогда во время выполнения генерируется исключение
System.OverflowException
try
catch
static void ProcessBytes()
{
byte b1 = 100;
byte b2 = 250;
<b> // На этот раз сообщить компилятору о необходимости добавления</b>
<b> // кода CIL, необходимого для генерации исключения, если возникает</b>
<b> // переполнение или потеря значимости.</b>
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
<PropertyGroup>
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
</PropertyGroup>
Настройка проверки переполнения на уровне проекта (Visual Studio)
Для активизации флага
/checked
/checked
На заметку! Если вы не выберете в списке вариант All Configurations, тогда настройка будет применена только к конфигурации, выбранной в текущий момент (т.е Debug (Отладка) или Release (Выпуск)).
Использование ключевого слова unchecked
А теперь предположим, что проверка переполнения и потери значимости включена в масштабах проекта, но есть блок кода, в котором потеря данных приемлема. Как с ним быть? Учитывая, что действие флага
/checked
unchecked
unchecked
checked
// Предполагая, что флаг /checked активизирован, этот блок
// не будет генерировать исключение времени выполнения.
unchecked