Zaškrtnuté a nezaškrtnuté (referenční dokumentace jazyka C#)
Příkazy jazyka C# se můžou spouštět v zaškrtnutém nebo nezaškrtnutém kontextu. V zaškrtnutém kontextu vyvolá aritmetický přetečení výjimku. V nezaškrtnutém kontextu se aritmetické přetečení ignoruje a výsledek se zkrátí zrušením všech bitů s vysokým pořadím, které se nevejdou do cílového typu.
Console.WriteLine(int.MaxValue); // 2147483647
Console.WriteLine($"0x{int.MaxValue:X}"); // 0x7FFFFFFF
Console.WriteLine(unchecked (int.MaxValue+1)); // -2147483648
Console.WriteLine($"0x{unchecked (int.MaxValue+1):X}"); // 0x80000000
Console.WriteLine(int.MinValue); // -2147483648
Console.WriteLine($"0x{int.MinValue:X}"); // 0x80000000
// Create overflow using compile-time constants:
// CS0220: The operation overflows at compile time in checked mode
// Console.WriteLine(checked (int.MaxValue+1));
try {
checked
{
var number = 1 + int.MaxValue / 2;
number += number;
}
} catch (OverflowException e)
{
Console.WriteLine("This operation overflows at runtime in checked mode.");
}
V zaškrtnutém režimu vygeneruje jakýkoli konstantní výraz, který přeteče nebo podtečení, chybu kompilátoru. Jakýkoli výraz, který přeteče za běhu, vyvolá System.OverflowException. V nezaškrtnutém režimu se zabalí z maximální hodnoty na minimální hodnotu.
- Kontrolovány Zadejte kontrolovaný kontext.
- Nekontrolovaná Zadejte nezaškrtnutý kontext.
Kontrola přetečení ovlivňuje následující operace:
Výrazy používající následující předdefinované operátory pro integrální typy:
++
, unární-
,--
+
, ,-
, , ,*
/
Explicitní číselné převody mezi integrálními typy nebo z
float
nebodouble
do celočíselného typu
Počínaje jazykem C# 11 můžete definovat variantu checked
pro operátory ovlivněné kontrolou přetečení. Pokud definujete checked
operátor, musíte také definovat operátor bez klíčového checked
slova. Další informace o zaškrtnutých a nezaškrtnutých operátorech najdete v tématu Aritmetické operátory.
Pokud ani checked
unchecked
není zadán, výchozí kontext pro nekonstanční výrazy (výrazy, které se vyhodnocují za běhu) jsou definovány hodnotou kompilátoru CheckForOverflowUnderflow . Ve výchozím nastavení je hodnota této možnosti neset aritmetické operace spuštěna v nezaškrtnutém kontextu.
Pro konstantní výrazy (výrazy, které lze plně vyhodnotit v době kompilace), je výchozí kontext vždy kontrolován. Pokud není konstantní výraz explicitně umístěný v nezaškrtnutém kontextu, přeteče, ke kterým dochází během vyhodnocení doby kompilace výrazu, způsobují chyby v době kompilace.