unchecked (Riferimenti per C#)

La parola chiave unchecked viene utilizzata per eliminare il controllo dell'overflow nelle conversioni e nelle operazioni aritmetiche di tipo integrale.

In un contesto non controllato, o di tipo unchecked, se un'espressione produce un valore non compreso nell'intervallo del tipo di destinazione, l'overflow non viene contrassegnato. Poiché, ad esempio, il calcolo nell'esempio seguente viene eseguito in un 'espressione o blocco di tipo unchecked, il fatto che il risultato sia troppo grande per un tipo Integer viene ignorato e a int1 viene assegnato il valore -2.147.483.639.

unchecked
{
    int1 = 2147483647 + 10;
}
int1 = unchecked(ConstantMax + 10);

Se l'ambiente unchecked viene rimosso, si verifica un errore di compilazione. È possibile rilevare l'overflow in fase di compilazione perché tutti i termini dell'espressione sono costanti.

Le espressioni che contengono termini non costanti non vengono controllate per impostazione predefinita in fase di compilazione e di esecuzione. Per informazioni sull'abilitazione di un ambiente controllato, o di tipo checked, vedere checked (Riferimenti per C#).

Poiché il controllo dell'overflow richiede tempo, l'utilizzo di codice non controllato in situazioni in cui non vi è pericolo di overflow potrebbe consentire un miglioramento delle prestazioni. Se tuttavia è possibile che si verifichi un overflow, è necessario utilizzare un ambiente controllato.

Esempio

In questo esempio viene illustrato come utilizzare la parola chiave unchecked.

class UncheckedDemo
{
    static void Main(string[] args)
    {
        // int.MaxValue is 2,147,483,647.
        const int ConstantMax = int.MaxValue;
        int int1;
        int int2;
        int variableMax = 2147483647;

        // The following statements are checked by default at compile time. They do not
        // compile.
        //int1 = 2147483647 + 10;
        //int1 = ConstantMax + 10;

        // To enable the assignments to int1 to compile and run, place them inside 
        // an unchecked block or expression. The following statements compile and
        // run.
        unchecked
        {
            int1 = 2147483647 + 10;
        }
        int1 = unchecked(ConstantMax + 10);

        // The sum of 2,147,483,647 and 10 is displayed as -2,147,483,639.
        Console.WriteLine(int1);


        // The following statement is unchecked by default at compile time and run 
        // time because the expression contains the variable variableMax. It causes  
        // overflow but the overflow is not detected. The statement compiles and runs.
        int2 = variableMax + 10;

        // Again, the sum of 2,147,483,647 and 10 is displayed as -2,147,483,639.
        Console.WriteLine(int2);

        // To catch the overflow in the assignment to int2 at run time, put the
        // declaration in a checked block or expression. The following
        // statements compile but raise an overflow exception at run time.
        checked
        {
            //int2 = variableMax + 10;
        }
        //int2 = checked(variableMax + 10);

        // Unchecked sections frequently are used to break out of a checked 
        // environment in order to improve performance in a portion of code 
        // that is not expected to raise overflow exceptions.
        checked
        { 
            // Code that might cause overflow should be executed in a checked
            // environment.
            unchecked
            { 
                // This section is appropriate for code that you are confident 
                // will not result in overflow, and for which performance is 
                // a priority.
            }
            // Additional checked code here. 
        }
    }
}

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

Parole chiave di C#

Checked e Unchecked (Riferimenti per C#)

checked (Riferimenti per C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#