Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De checked
en unchecked
instructies geven de context voor overloopcontrole op voor rekenkundige bewerkingen en conversies van integraal type. De standaardinstructie is unchecked
. Wanneer een rekenkundige overloop van gehele getallen optreedt, definieert de context voor overloopcontrole wat er gebeurt. In een gecontroleerde context wordt een System.OverflowException gegooid; als er een overloop plaatsvindt in een constante expressie, ontstaat er een compilatietijdfout. In een niet-gecontroleerd context wordt het bewerkingsresultaat afgekapt door alle bits in hoge volgorde te verwijderen die niet in het doeltype passen. Toevoegingen worden bijvoorbeeld van de maximumwaarde tot de minimumwaarde verpakt. In het volgende voorbeeld ziet u dezelfde bewerking in zowel een ingeschakelde als niet-gecontroleerde context:
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.
}
Notitie
Het overloopgedrag van door de gebruiker gedefinieerde operators en conversies kan verschillen van het gedrag dat in de voorgaande alinea wordt beschreven. Met name door de gebruiker gedefinieerde gecontroleerde operators kunnen geen uitzondering genereren in een gecontroleerde context.
Zie de secties Rekenkundige overloop en deling door nul en door de gebruiker gedefinieerde operatoren van het artikel Rekenkundige operators voor meer informatie.
Als u de context voor overloopcontrole voor een expressie wilt opgeven, kunt u ook de checked
en unchecked
operators gebruiken, zoals in het volgende voorbeeld wordt weergegeven:
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.
}
De checked
en unchecked
instructies en operatoren zijn alleen van invloed op de context van overloopcontrole voor bewerkingen die textueel binnen het instructieblok of de haakjes van de operator staan, zoals het volgende voorbeeld toont.
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.
}
In het voorgaande voorbeeld toont de eerste aanroep van de Multiply
lokale functie dat de checked
instructie geen invloed heeft op de context van overloopcontrole binnen de Multiply
functie, omdat er geen uitzondering wordt gegenereerd. Bij de tweede aanroep van de Multiply
functie wordt de expressie die het tweede argument van de functie berekent, geëvalueerd in een gecontroleerde context en resulteert dit in een uitzondering omdat deze tekstually binnen het blok van de checked
instructie ligt.
Het gedrag van checked
en unchecked
is afhankelijk van het type en de bewerking. Zelfs voor gehele getallen leiden bewerkingen zoals unchecked(x / 0)
altijd tot een uitzondering omdat er geen zinvol gedrag mogelijk is. Controleer het gedrag van het type en de bewerking om te begrijpen hoe de checked
code en unchecked
trefwoorden van invloed zijn op uw code.
Numerieke typen en context voor overloopcontrole
De checked
trefwoorden en unchecked
trefwoorden zijn voornamelijk van toepassing op integrale typen waarbij er sprake is van een verstandig overloopgedrag. Het wraparound-gedrag waarbij T.MaxValue + 1
T.MinValue
wordt, is logisch binnen een twee-complement-representatie. De vertegenwoordigde waarde is niet juist omdat deze niet in de opslag voor het type past. Daarom zijn de bits representatief voor de lagere n-bits van het volledige resultaat.
Voor typen zoals decimal
, float
, en double
Half
die een complexere waarde of een aanvullingswaarde vertegenwoordigen, is wraparound niet verstandig. Het kan niet worden gebruikt om grotere of nauwkeurigere resultaten te berekenen, dus unchecked
is dit niet nuttig.
float
, double
en Half
hebben verstandige verzadigingswaarden voor PositiveInfinity
en NegativeInfinity
, zodat u overloop in een unchecked
context kunt detecteren. Voor decimal
bestaan er geen dergelijke limieten en verzadiging bij MaxValue
kan leiden tot fouten of verwarring. Bewerkingen die gebruikmaken van decimal
gooien zowel in een checked
- als een unchecked
-context.
Bewerkingen die beïnvloed worden door de context van overloopcontrole
De context voor overloopcontrole is van invloed op de volgende bewerkingen:
De volgende ingebouwde rekenkundige operatoren: unaire ,
++
,--
en binaire-
,+
,-
,*
operatoren, wanneer hun operanden van een integraal type zijn (dat wil zeggen, integraal numeriek of karaktertype) of een opsommingstype.Expliciete numerieke conversies tussen integrale typen of van
float
ofdouble
naar een integraal type.Notitie
Wanneer u een
decimal
waarde converteert naar een integraal type en het resultaat buiten het bereik van het doeltype valt, wordt er altijd een OverflowException gegenereerd, ongeacht de context voor overloopcontrole.Vanaf C# 11 worden door de gebruiker gedefinieerde gecontroleerde operators en conversies ondersteund. Zie de sectie Door de gebruiker gedefinieerde operators van het artikel Rekenkundige operators voor meer informatie.
Standaard-overloopcontrolecontext
Als u de context voor overloopcontrole niet opgeeft, definieert de waarde van de compileroptie CheckForOverflowUnderflow de standaardcontext voor niet-stante expressies. Standaard is de waarde van deze optie niet-ingesteld en worden rekenkundige bewerkingen en conversies van integraal type uitgevoerd in een niet-gecontroleerd context.
Constante expressies worden standaard geëvalueerd in een gecontroleerde context en overloop veroorzaakt een compilatietijdfout. U kunt expliciet een niet-gecontroleerde context opgeven voor een constante expressie met de unchecked
statement of operator.
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie:
- De gecontroleerde en ongecontroleerde instructies
- De ingeschakelde en uitgeschakelde operators
- Door de gebruiker gedefinieerde gecontroleerde en ongecontroleerde operators - C# 11