ingeschakelde en niet-gecontroleerde instructies (C#-verwijzing)
De checked
en unchecked
instructies geven de context voor overloopcontrole op voor rekenkundige bewerkingen en conversies van integraal type. Wanneer een rekenkundige overloop van gehele getallen optreedt, definieert de context voor overloopcontrole wat er gebeurt. In een gecontroleerde context wordt een System.OverflowException fout gegenereerd. Als er een overloop plaatsvindt in een constante expressie, treedt er een compilatietijdfout op. In een niet-gecontroleerd context wordt het bewerkingsresultaat afgekapt door alle bits in hoge volgorde te verwijderen die niet in het doeltype passen. In het geval van optellen loopt deze bijvoorbeeld terug van de maximumwaarde naar de minimumwaarde. 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 gedrag van door de gebruiker gedefinieerde operators en conversies in het geval van overloop kan afwijken van het gedrag dat in de vorige alinea is 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
instructies unchecked
en operatoren zijn alleen van invloed op de context van overloopcontrole voor bewerkingen die tekst bevatten binnen het instructieblok of haakjes van de operator, zoals in het volgende voorbeeld wordt weergegeven:
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.
Bewerkingen die worden beïnvloed door de context voor overloopcontrole
De context voor overloopcontrole is van invloed op de volgende bewerkingen:
De volgende ingebouwde rekenkundige operatoren: unaire
++
,--
en-
binaire ,-
en/
*
operatoren+
, wanneer hun operanden van een integraal type zijn (dat wil gezegd, integraal numeriek of tekentype) 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 zijn door de gebruiker gedefinieerde operators en conversies ingeschakeld. Zie de sectie Door de gebruiker gedefinieerde operators van het artikel Rekenkundige operators voor meer informatie.
Standaardoverloopcontrolecontext
Als u de context voor overloopcontrole niet opgeeft, definieert de waarde van de compileroptie CheckForOverflowUnderflow de standaardcontext voor niet-constante 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 er treedt een compilatiefout op in het geval van overloop. U kunt expliciet een niet-gecontroleerd context opgeven voor een constante expressie met de unchecked
instructie of operator.
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie:
- De ingeschakelde en niet-gecontroleerde instructies
- De ingeschakelde en uitgeschakelde operators
- Door de gebruiker gedefinieerde en uitgeschakelde operators - C# 11
Zie ook
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor