zaškrtnuté a nezaškrtnuté příkazy (referenční dokumentace jazyka C#)

unchecked Příkazy checked určují kontext kontroly přetečení pro aritmetické operace a převody celočíselného typu. Když dojde k aritmetickému přetečení celého čísla, kontext kontroly přetečení definuje, co se stane. V kontrolovaném kontextu System.OverflowException je vyvolán. Pokud dojde k přetečení v konstantním výrazu, dojde k chybě v době kompilace. V nezaškrtnutém kontextu se výsledek operace zkrátí tak, že zahodí všechny bity s vysokým pořadím, které se nevejdou do cílového typu. Například v případě sčítání se zabalí z maximální hodnoty na minimální hodnotu. Následující příklad ukazuje stejnou operaci v zaškrtnutém i nezaškrtnutém kontextu:

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

Poznámka:

Chování uživatelem definovaných operátorů a převodů v případě přetečení se může lišit od chování popsaného v předchozím odstavci. Konkrétně uživatelem definované kontrolované operátory nemusí vyvolat výjimku v kontrolovaném kontextu.

Další informace najdete v oddílech Aritmetických přetečení a dělení nulou a uživatelem definovanými operátory v článku Aritmetické operátory.

Pokud chcete zadat kontext kontroly přetečení výrazu, můžete také použít operátory checked a unchecked operátory, jak ukazuje následující příklad:

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

Příkazy checked a unchecked operátory mají vliv pouze na kontext kontroly přetečení pro operace, které jsou textově uvnitř bloku příkazu nebo závorek operátoru, jak ukazuje následující příklad:

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

V předchozím příkladu první vyvolání Multiply místní funkce ukazuje, že checked příkaz nemá vliv na kontext kontroly přetečení v rámci Multiply funkce, protože není vyvolán žádná výjimka. Při druhém vyvolání Multiply funkce se výraz, který vypočítá druhý argument funkce, vyhodnotí v kontrolovaném kontextu a výsledkem je výjimka, protože je textově uvnitř bloku checked příkazu.

Operace ovlivněné kontextem kontroly přetečení

Kontext kontroly přetečení má vliv na následující operace:

Výchozí kontext kontroly přetečení

Pokud nezadáte kontext kontroly přetečení, definuje hodnota možnosti kompilátoru CheckForOverflowUnderflow výchozí kontext pro ne constantní výrazy. Ve výchozím nastavení se hodnota této možnosti nespustí a aritmetické operace a převody celočíselného typu v nezaškrtnutém kontextu.

Výrazy konstant se ve výchozím nastavení vyhodnocují v kontrolovaném kontextu a v případě přetečení dojde k chybě v době kompilace. Pomocí příkazu nebo operátoru můžete explicitně zadat nezaškrtnutý kontext pro konstantní výraz unchecked .

specifikace jazyka C#

Další informace najdete v následujících částech specifikace jazyka C#:

Viz také