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:
Následující předdefinované aritmetické operátory: unární
++
operátory ,-
--
a binární+
operátory ,-
,*
, a , pokud/
jsou jejich operandy celočíselného typu (to znamená celočíselného typu nebo typu znaku) nebo typu výčtu.Explicitní číselné převody mezi integrálními typy nebo z
float
nebodouble
na integrální typ.Poznámka
Při převodu
decimal
hodnoty na celočíselný typ a výsledek je mimo rozsah cílového typu, OverflowException je vždy vyvolán bez ohledu na kontext kontroly přetečení.Počínaje jazykem C# 11 jsou uživatelem definované operátory a převody. Další informace najdete v části Uživatelem definované kontrolované operátory článku aritmetické operátory .
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#:
- Zaškrtnuté a nezaškrtnuté příkazy
- Zaškrtnuté a nezaškrtnuté operátory
- Uživatelem definované zaškrtnuté a nezaškrtnuté operátory – C# 11