Looking for c# Keywords? Try Ask4Keywords

C# Language checked, unchecked


пример

checked и unchecked ключевые слова определяют, как операции обрабатывают математическое переполнение. «Переполнение» в контексте checked и unchecked ключевых слов - это когда целочисленная арифметическая операция приводит к значению, которое больше по величине, чем может представлять целевой тип данных.

Когда переполнение происходит в пределах checked блока (или когда компилятор настроен на глобальное использование проверенной арифметики), исключение выдается для предупреждения о нежелательном поведении. Между тем, в unchecked блоке, переполнение не работает: никаких исключений не выбрасывается, и значение просто переносится на противоположную границу. Это может привести к тонким, трудно найти ошибки.

Поскольку большинство арифметических операций выполняются по значениям, которые не являются большими или достаточно малыми для переполнения, большую часть времени нет необходимости явно определять блок как checked . Необходимо проявлять осторожность при выполнении арифметики на неограниченном входе, что может вызвать переполнение, например, при выполнении арифметики в рекурсивных функциях или при вводе пользователя.

Не checked и unchecked checked влияние арифметических операций с плавающей запятой.

Когда блок или выражение объявляются как unchecked , любые арифметические операции внутри него допускают переполнение без возникновения ошибки. Примером, когда это поведение является желательным , является вычисление контрольной суммы, когда значение разрешено «обертывать» во время вычисления:

byte Checksum(byte[] data) {
    byte result = 0;
    for (int i = 0; i < data.Length; i++) {
        result = unchecked(result + data[i]); // unchecked expression
    }
    return result;
}

Одним из наиболее распространенных применений для unchecked является реализация настраиваемого переопределения для object.GetHashCode() , типа контрольной суммы. Вы можете увидеть использование ключевого слова в ответах на этот вопрос: Каков наилучший алгоритм для переопределенного System.Object.GetHashCode? ,

Когда блок или выражение объявляются как checked , любая арифметическая операция, которая вызывает переполнение, приводит к тому, что генерируется OverflowException .

int SafeSum(int x, int y) {
    checked { // checked block
        return x + y; 
    }
}

Как проверенные, так и непроверенные могут быть в форме блока и выражения.

Проверенные и непроверенные блоки не влияют на вызываемые методы, только операторы, вызываемые непосредственно в текущем методе. Например, Enum.ToObject() , Convert.ToInt32() и определяемые пользователем операторы не зависят от настраиваемых проверенных / непроверенных контекстов.

Примечание . По умолчанию поведение по умолчанию переполнения (проверено или не отмечено) может быть изменено в свойствах проекта или с помощью переключателя командной строки [+ | -] . Обычно по умолчанию проверяются операции для отладочных сборников и неконтролируемые для выпуска сборок. checked и unchecked ключевые слова будут использоваться только тогда, когда подход по умолчанию не применяется, и для обеспечения правильности требуется четкое поведение.