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

Příkazy checked a unchecked určují kontext kontroly přetečení pro aritmetické operace a převody celočíselného typu. Když dojde k celočíselnému aritmetickému přetečení, kontext kontroly přetečení definuje, co se stane. Ve kontrolovaném kontextu System.OverflowException je vyvolán objekt . 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í tím, že se zahodí všechny bity ve vysokém pořadí, které se nevejdou do cílového typu. Například v případě sčítání se zabalí od maximální hodnoty k minimální hodnotě. 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é operátory se kontrolou nemusí vyvolat výjimku ve kontrolovaném kontextu.

Další informace najdete v částech aritmetické přetečení a dělení nulou a Uživatelem definované operátory v článku aritmetické operátory .

K určení kontextu kontroly přetečení pro výraz můžete použít také operátory checked a unchecked , 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 a ovlivňují kontext kontroly přetečení pouze pro ty operace, které jsou textově uvnitř bloku příkazů 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 se nevyvolá žádná výjimka. Při druhém vyvolání Multiply funkce je výraz, který vypočítá druhý argument funkce, vyhodnocen 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í ovlivňuje následující operace:

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

Pokud nezadáte kontext kontroly přetečení, hodnota možnosti kompilátoru CheckForOverflowUnderflow definuje výchozí kontext pro výrazy, které nejsou konstantní. Ve výchozím nastavení je hodnota této možnosti nenasažená a aritmetické operace a převody celočíselného typu se provádějí v nezaškrtnutém kontextu.

Konstantní výrazy se ve výchozím nastavení vyhodnocují v kontrolovaném kontextu a v případě přetečení dojde k chybě 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é