Compartir a través de


Instrucciones activadas y desactivadas (referencia de C#)

Las instrucciones checked y unchecked especifican el contexto de comprobación de desbordamiento para conversiones y operaciones aritméticas de tipo integral. La instrucción predeterminada es unchecked. Cuando se produce un desbordamiento aritmético de enteros, el contexto de comprobación de desbordamiento define lo que sucede. En un contexto comprobado, se produce una System.OverflowException excepción . Si el desbordamiento se produce en una expresión constante, se produce un error en tiempo de compilación. En un contexto no comprobado, el resultado de la operación se trunca mediante el descarte de los bits de orden superior que no caben en el tipo de destino. Por ejemplo, la adición se ajusta del valor máximo al valor mínimo. En el ejemplo siguiente se muestra la misma operación en un contexto de comprobación y no comprobación:

uint a = uint.MaxValue;

unchecked
{
    Console.WriteLine(a + 3);  // output: 2
}

try
{
    checked
    {
        Console.WriteLine(a + 3);
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Nota:

El comportamiento de desbordamiento de operadores y conversiones definidos por el usuario puede diferir del comportamiento descrito en el párrafo anterior. En concreto, es posible que los operadores comprobados definidos por el usuario no inicien una excepción en un contexto comprobado.

Para más información, consulte las secciones Desbordamiento aritmético y división por cero y Operadores comprobados definidos por el usuario del artículo Operadores aritméticos.

La referencia del lenguaje C# documenta la versión publicada más recientemente del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

Para especificar el contexto de comprobación de desbordamiento de una expresión, también puede usar los operadores checked y unchecked, como se muestra en el ejemplo siguiente:

double a = double.MaxValue;

int b = unchecked((int)a);
Console.WriteLine(b);  // output: -2147483648

try
{
    b = checked((int)a);
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Las instrucciones y los operadores checked y unchecked solo afectan al contexto de comprobación de desbordamiento de esas operaciones que están textualmente dentro del bloque de instrucciones o los paréntesis del operador, como se muestra en el ejemplo siguiente:

int Multiply(int a, int b) => a * b;

int factor = 2;

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, int.MaxValue));  // output: -2
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);
}

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, factor * int.MaxValue));
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

En el ejemplo anterior, la primera invocación de la Multiply función local muestra que la checked instrucción no afecta al contexto de comprobación de desbordamiento dentro de la Multiply función, ya que no se produce ninguna excepción. En la segunda invocación de la función Multiply, la expresión que calcula el segundo argumento de la función se evalúa en un contexto comprobado y da como resultado una excepción, ya que está textualmente dentro del bloque de la instrucción checked.

El comportamiento de checked y unchecked depende del tipo y de la operación. Incluso para enteros, las operaciones como unchecked(x / 0) siempre se producen porque no hay ningún comportamiento razonable. Compruebe el comportamiento del tipo y la operación para comprender cómo afectan el código y checked las unchecked palabras clave.

Tipos numéricos y contexto de comprobación de desbordamiento

Las checked palabras clave y unchecked se aplican principalmente a los tipos enteros donde hay un comportamiento de desbordamiento razonable. El comportamiento encapsulado en el que T.MaxValue + 1 se convierte en T.MinValue razonable en el valor de complemento de dos. El valor representado no es correcto , ya que no puede caber en el almacenamiento del tipo. Por lo tanto, los bits son representativos de los n bits inferiores del resultado completo.

Para tipos como decimal, float, doubley Half que representan un valor más complejo o un valor complementario de uno, la solución de ajuste no es razonable. No se puede usar para calcular resultados más grandes o más precisos, por lo que unchecked no es beneficioso.

float, doubley Half tienen valores de saturación razonables para PositiveInfinity y NegativeInfinity, por lo que puede detectar desbordamiento en un unchecked contexto. Para decimal, no existen estos límites y la saturación en MaxValue puede provocar errores o confusión. Las operaciones que usan decimal inician en un checked contexto y unchecked .

Operaciones afectadas por el contexto de comprobación de desbordamiento

El contexto de comprobación de desbordamiento afecta a las siguientes operaciones:

Contexto de comprobación de desbordamiento predeterminado

Si no especifica el contexto de comprobación de desbordamiento, el valor de la opción del compilador CheckForOverflowUnderflow define el contexto predeterminado para las expresiones noconstantes. De forma predeterminada, el valor de esa opción se anula y se ejecutan operaciones aritméticas de tipo entero en un contexto no comprobado.

Las expresiones constantes se evalúan de forma predeterminada en un contexto comprobado y el desbordamiento produce un error en tiempo de compilación. Puede especificar explícitamente un contexto no comprobado para una expresión constante mediante la instrucción o el unchecked operador .

Especificación del lenguaje C#

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:

Consulte también