istruzioni checked e unchecked (riferimenti per C#)

Le istruzioni checked e unchecked vengono usate per verificare il contesto di controllo dell'overflow per le conversioni e le operazioni aritmetiche di tipo integrale. Quando si verifica l'overflow aritmetico di numeri interi, il contesto di controllo dell'overflow definisce cosa accade. In un contesto controllato viene generata una System.OverflowException; se l'overflow si verifica in un'espressione costante, si verifica un errore in fase di compilazione. In un contesto non verificato, il risultato dell'operazione viene troncato rimuovendo tutti i bit di ordine elevato che non rientrano nel tipo di destinazione. Ad esempio, nel caso di aggiunta, esegue il wrapping dal valore massimo al valore minimo. L'esempio seguente mostra la stessa operazione in un contesto verificato e non verificato:

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

Il comportamento degli operatori e delle conversioni definiti dall'utente nel caso di overflow può differire da quello descritto nel paragrafo precedente. In particolare, gli operatori verificati definiti dall'utente potrebbero non generare un'eccezione in un contesto controllato.

Per altre informazioni, vedere le sezioni Overflow aritmetico e divisione per zero e Operatori verificati definiti dall'utente dell'articolo Operatori aritmetici.

Per specificare il contesto di controllo dell'overflow per un'espressione, è anche possibile usare gli operatori checked e unchecked, come illustrato nell'esempio seguente:

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.
}

Le istruzioni e gli operatori checked e unchecked influiscono solo sul contesto di controllo dell'overflow per le operazioni che sono testualmente all'interno delle parentesi del blocco di istruzioni o dell'operatore, come illustrato nell'esempio seguente:

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.
}

Nell'esempio precedente, la prima chiamata della funzione locale Multiply mostra che l'istruzione checked non influisce sul contesto di controllo dell'overflow all'interno della funzione Multiply perché non viene generata alcuna eccezione. Alla seconda chiamata della funzione Multiply, l'espressione che calcola il secondo argomento della funzione viene valutata in un contesto controllato e restituisce un'eccezione mentre è testualmente all'interno del blocco dell'istruzione checked.

Operazioni interessate dal contesto di controllo dell'overflow

Il contesto di controllo dell'overflow influisce sulle operazioni seguenti:

Contesto di controllo overflow predefinito

Se non si specifica il contesto di controllo dell'overflow, il valore dell'opzione del compilatore CheckForOverflowUnderflow definisce il contesto predefinito per le espressioni non costanti. Per impostazione predefinita, il valore di tale opzione è unset e le operazioni aritmetiche di tipo integrale e le conversioni vengono eseguite in un contesto non verificato.

Le espressioni costanti vengono valutate per impostazione predefinita in un contesto controllato e si verifica un errore in fase di compilazione in caso di overflow. È possibile specificare in modo esplicito un contesto non verificato per un'espressione costante con l'istruzione o l'operatore unchecked.

Specifiche del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedi anche