unchecked (справочник по C#)

Ключевое слово unchecked используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа.

Если в непроверяемом контексте результатом выполнения выражения является значение, выходящее за допустимые пределы значений конечного типа, то переполнение не помечается. Вычисление в приведенном ниже примере выполняется в блоке или выражении unchecked, поэтому факт превышения результатом максимального значения целого числа игнорируется и переменной int1 присваивается значение -2 147 483 639.

unchecked
{
    int1 = 2147483647 + 10;
}
int1 = unchecked(ConstantMax + 10);

Если среда unchecked удалена, возникает ошибка компиляции. Все члены данного выражения являются константами, поэтому переполнение можно обнаружить во время компиляции.

Выражения, содержащие неконстантные члены, не проверяются во время компиляции и выполнения по умолчанию. Сведения о включении проверяемой среды см. в разделе checked (Справочник по C#).

Проверка на переполнение занимает некоторое время, поэтому использование непроверяемого кода в ситуациях, в которых отсутствует опасность переполнения, поможет повысить производительность. Однако при наличии вероятности переполнения следует использовать проверяемую среду.

Пример

В этом примере показано, как использовать ключевое слово unchecked.

class UncheckedDemo
{
    static void Main(string[] args)
    {
        // int.MaxValue is 2,147,483,647. 
        const int ConstantMax = int.MaxValue;
        int int1;
        int int2;
        int variableMax = 2147483647;

        // The following statements are checked by default at compile time. They do not 
        // compile. 
        //int1 = 2147483647 + 10; 
        //int1 = ConstantMax + 10; 

        // To enable the assignments to int1 to compile and run, place them inside  
        // an unchecked block or expression. The following statements compile and 
        // run. 
        unchecked
        {
            int1 = 2147483647 + 10;
        }
        int1 = unchecked(ConstantMax + 10);

        // The sum of 2,147,483,647 and 10 is displayed as -2,147,483,639.
        Console.WriteLine(int1);


        // The following statement is unchecked by default at compile time and run  
        // time because the expression contains the variable variableMax. It causes   
        // overflow but the overflow is not detected. The statement compiles and runs.
        int2 = variableMax + 10;

        // Again, the sum of 2,147,483,647 and 10 is displayed as -2,147,483,639.
        Console.WriteLine(int2);

        // To catch the overflow in the assignment to int2 at run time, put the 
        // declaration in a checked block or expression. The following 
        // statements compile but raise an overflow exception at run time. 
        checked
        {
            //int2 = variableMax + 10;
        }
        //int2 = checked(variableMax + 10); 

        // Unchecked sections frequently are used to break out of a checked  
        // environment in order to improve performance in a portion of code  
        // that is not expected to raise overflow exceptions. 
        checked
        { 
            // Code that might cause overflow should be executed in a checked 
            // environment. 
            unchecked
            { 
                // This section is appropriate for code that you are confident  
                // will not result in overflow, and for which performance is  
                // a priority.
            }
            // Additional checked code here. 
        }
    }
}

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

Checked и Unchecked (Справочник по C#)

checked (Справочник по C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#