C# Language comprobado, sin marcar


Ejemplo

Las palabras clave checked y unchecked checked definen cómo las operaciones manejan el desbordamiento matemático. "Desbordamiento" en el contexto de las palabras clave checked y unchecked checked es cuando una operación aritmética entera da como resultado un valor que es mayor en magnitud de lo que puede representar el tipo de datos objetivo.

Cuando se produce un desbordamiento dentro de un bloque checked (o cuando el compilador está configurado para usar aritmética comprobada globalmente), se lanza una excepción para advertir de un comportamiento no deseado. Mientras tanto, en un bloque unchecked marcar, el desbordamiento es silencioso: no se lanzan excepciones, y el valor simplemente se ajustará al límite opuesto. Esto puede llevar a errores sutiles y difíciles de encontrar.

Como la mayoría de las operaciones aritméticas se realizan en valores que no son lo suficientemente grandes o pequeños como para desbordarse, la mayoría de las veces, no es necesario definir explícitamente un bloque como checked . Se debe tener cuidado al realizar operaciones aritméticas en entradas no limitadas que pueden causar un desbordamiento, por ejemplo, cuando se realizan operaciones aritméticas en funciones recursivas o al recibir entradas del usuario.

Ni checked ni unchecked afecto flotante operaciones aritméticas de punto.

Cuando un bloque o expresión se declara como unchecked , cualquier operación aritmética dentro de él puede desbordarse sin causar un error. Un ejemplo en el que se desea este comportamiento sería el cálculo de una suma de comprobación, donde se permite que el valor se "ajuste" durante el cálculo:

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

Uno de los usos más comunes para unchecked es la implementación de un reemplazo personalizado para object.GetHashCode() , un tipo de suma de comprobación. Puede ver el uso de la palabra clave en las respuestas a esta pregunta: ¿Cuál es el mejor algoritmo para un System.Object.GetHashCode anulado? .

Cuando se declara que un bloque o expresión está checked , cualquier operación aritmética que cause un desbordamiento da lugar a que se OverflowException una OverflowException .

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

Ambos marcados y sin marcar pueden estar en forma de bloque y expresión.

Los bloques marcados y no marcados no afectan los métodos llamados, solo los operadores llamados directamente en el método actual. Por ejemplo, Enum.ToObject() , Convert.ToInt32() , y los operadores definidos por el usuario no se ven afectados por los contextos personalizados marcados / no seleccionados.

Nota : El comportamiento predeterminado de desbordamiento predeterminado (marcado contra no seleccionado) puede cambiarse en las Propiedades del proyecto o mediante el interruptor de línea de comando / marcado [+ | -] . Es común predeterminar las operaciones comprobadas para las compilaciones de depuración y no verificadas para las compilaciones de lanzamiento. Las palabras clave checked y unchecked marcar se usarían entonces solo cuando el enfoque predeterminado no se aplique y usted necesite un comportamiento explícito para garantizar la corrección.