Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1463. #ЗаметкиНаПолях Разбираем Ключевое Слово Unchecked в C# Ключевое слово unchecked в C# используется для отключения проверки переполнения для целочисленных операций в блоке кода. Т.е. программа не выбросит исключение и продолжит работу с результирующим значением, если операция может вызвать переполнение или потерю значимости. Это поведение по умолчанию для целочисленных операций в C#:
int x = int.MaxValue; 
x = x + 1;
Здесь x будет равно -2147483648, исключения не будет. Основные причины использования такой логики - проблемы с производительностью и работа с унаследованным кодом, когда вы знаете, что переполнения или потери значимости не произойдет. Но это может привести к неожиданному поведению и проблемам. Чтобы такого не происходило, в C# есть ключевое слово checked, которое может быть использовано, чтобы указать, что операция или блок кода должен выбрасывать исключение при переполнении:
int x = int.MaxValue; 
checked 
{ 
  x = x + 1; 
}
Этот код выбросит System.OverflowException. Важно заметить, что вы можете явно отключить проверку переполнения в блоке кода, с помощью ключевого слова unchecked. В общем случае, если у вас нет особой причины предвидеть и обрабатывать эти обстоятельства, рекомендуется использовать блоки кода checked, чтобы предотвратить непредвиденное поведение и дефекты, вызванные целочисленным переполнением или потерей значимости. Рассмотрим несколько примеров:
Console.WriteLine(
 unchecked(long.MaxValue + long.MaxValue)
);
Console.WriteLine(
 unchecked((ulong)(long.MaxValue + long.MaxValue))
);
Console.WriteLine(ulong.MaxValue);

В коде выше long.MaxValue + long.MaxValue превышает максимальное значение, которое может представлять long, но из-за ключевого слова unchecked программа не выдаст исключения. Вместо этого переполнение выдаст результат, в данном случае -2. Во втором случае результат будет преобразован в ulong, т.е. 18446744073709551614. В третьем случае мы просто выводим максимальное значение для ulong - 18446744073709551615. Итого Когда арифметическая операция возвращает число, которое слишком велико или слишком мало для представления используемым типом данных, такое состояние называется переполнением (overflow). Подобно переполнению, недополнение (underflow) происходит, когда результат операции слишком мал, чтобы быть представленным типом данных. В языке C# есть техника, называемая переносом (wrap-around), для управления переполнением и недополнением в обеих ситуациях. Т.е. в случае переполнения, всё, что выше максимального значения, будет добавлено к минимальному значению типа, например: int.MaxValue + 1 = int.MinValue; аналогично для недополнения: int.MinValue – 2 = int.MaxValue - 1; Заметьте, что несмотря на то, что арифметические операции над переменными по умолчанию исполняются в unchecked контексте, константные выражения вычисляются по умолчанию в проверяемом (checked) контексте, а в случае переполнения возникает ошибка времени компиляции. Т.е. нельзя использовать
x = int.MaxValue + 1;
При использовании констант нужно явно указать unchecked контекст:
x = unchecked(int.MaxValue + 1);

Источник: https://dev.to/simsekahmett/understanding-and-using-the-unchecked-keyword-in-c-hfg