Share via


unchecked (Referencia de C#)

La palabra clave unchecked se utiliza con el fin de suprimir la comprobación de desbordamiento para operaciones aritméticas y conversiones de tipo integral.

En un contexto sin comprobación de desbordamiento, si una expresión genera un valor fuera del intervalo del tipo de destino, no se marca el desbordamiento. Por ejemplo, como el cálculo en el siguiente ejemplo se realiza en una expresión o un bloque unchecked, se pasa por alto que el resultado es demasiado grande para un valor entero y se asigna a int1 el valor -2.147.483.639.

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

Si se quita el entorno unchecked, se produce un error de compilación. Se puede detectar el desbordamiento en tiempo de compilación porque todos los términos de la expresión son constantes.

De forma predeterminada, se suprime la comprobación de desbordamiento de las expresiones que contienen términos no constantes en tiempo de compilación y tiempo de ejecución. Vea checked (Referencia de C#) para obtener información sobre un entorno con comprobación de desbordamiento.

Dado que la comprobación de desbordamiento requiere tiempo, el uso de código sin comprobación podría mejorar el rendimiento en casos en los que no existe riesgo de desbordamiento. Sin embargo, si existe la posibilidad de que se produzca un desbordamiento, se debe usar un entorno con comprobación de desbordamiento.

Ejemplo

En este ejemplo, se muestra cómo usar la palabra clave 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. 
        }
    }
}

Especificación del lenguaje C#

Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

Palabras clave de C#

Checked y Unchecked (Referencia de C#)

checked (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#