instrucciones comprobadas y no comprobadas (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. 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 inicia una excepción System.OverflowException; si el desbordamiento tiene lugar en una expresión constante, se produce un error 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, en el caso de la adición, se encapsula 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 los operadores y conversiones definidos por el usuario en el caso del desbordamiento puede diferir del 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.
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 función local Multiply
muestra que la instrucción checked
no afecta al contexto de comprobación de desbordamiento dentro de la función Multiply
, 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
.
Operaciones afectadas por el contexto de comprobación de desbordamiento
El contexto de comprobación de desbordamiento afecta a las siguientes operaciones:
Los siguientes operadores aritméticos integrados: operadores unarios
++
,--
,-
y operadores binarios+
,-
,*
y/
, cuando sus operandos son de tipo entero (es decir, tipo numérico integral o char) o tipo enumeración.Conversiones numéricas explícitas entre tipos enteros o de
float
odouble
a un tipo entero.Nota
Cuando se convierte un valor
decimal
en un tipo entero y el resultado está fuera del intervalo del tipo de destino, siempre se produce una excepción OverflowException, con independencia del contexto de comprobación de desbordamiento.A partir de C# 11, los operadores y conversiones comprobados definidos por el usuario. Para obtener más información, consulte la sección Operadores comprobados definidos por el usuario del artículo Operadores aritméticos.
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 de las expresiones no constantes. 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 se produce un error en tiempo de compilación en caso de desbordamiento. Puede especificar explícitamente un contexto no comprobado para una expresión constante con la instrucción o el operador unchecked
.
Especificación del lenguaje C#
Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:
- Instrucciones checked y unchecked
- Operadores checked y unchecked
- Operadores comprobados y no comprobados definidos por el usuario: C# 11
Consulte también
- Opción del compilador CheckForOverflowUnderflow