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:
I seguenti operatori aritmetici predefiniti: operatori unari
++
,--
,-
e binari+
,-
,*
, e operatori/
, quando gli operandi sono di un tipo integrale, ovvero numerico integrale o tipo di char) o un tipo enumerazione.Conversioni numeriche esplicite tra tipi integrali o da
float
odouble
a un tipo integrale.Nota
Quando si converte un valore
decimal
in un tipo integrale e il risultato non rientra nell'intervallo del tipo di destinazione, viene sempre generata un'eccezione OverflowException indipendentemente dal contesto di controllo dell'overflow.A partire da C# 11, gli operatori e le conversioni controllati definiti dall'utente. Per altre informazioni, vedere la sezione Operatori controllati definiti dall'utente dell'articolo Operatori aritmetici.
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#:
- Istruzioni Checked e Unchecked
- Operatori Checked e Unchecked
- Operatori controllati e non verificati definiti dall'utente - C# 11
Vedi anche
- Opzione del compilatore CheckForOverflowUnderflow