bejelölt és nem ellenőrzött utasítások (C# hivatkozás)
Az checked
és unchecked
az utasítások meghatározzák az integrál típusú aritmetikai műveletek és átalakítások túlcsordulás-ellenőrzési környezetét. Egész számtani túlcsordulás esetén a túlcsordulás-ellenőrzési környezet határozza meg, hogy mi történik. Egy ellenőrzött környezetben System.OverflowException a rendszer egy hibát jelez; ha egy állandó kifejezésben túlcsordulás történik, fordítási időhiba lép fel. A nem bejelölt környezetben a művelet eredménye csonkul, ha elveti a céltípusba nem illő, magasrendű biteket. Például összeadás esetén a maximális értékről a minimális értékre tördel. Az alábbi példa ugyanazt a műveletet mutatja be egy ellenőrzött és a nem ellenőrzött környezetben is:
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.
}
Feljegyzés
A felhasználó által definiált operátorok és konverziók viselkedése túlcsordulás esetén eltérhet az előző bekezdésben leírttól. Előfordulhat, hogy a felhasználó által megadott ellenőrzött operátorok nem adnak kivételt egy ellenőrzött környezetben.
További információkért tekintse meg az Aritmetikai túlcsordulás és osztás nullával és felhasználó által definiált ellenőrzött operátorokkal című cikket az Aritmetikai operátorok című cikkből.
Egy kifejezés túlcsordulás-ellenőrzési környezetének megadásához használhatja az és unchecked
az checked
operátorokat is, ahogy az alábbi példa mutatja:
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.
}
Az checked
és az utasítások és unchecked
operátorok csak azoknak a műveleteknek a túlcsordulás-ellenőrzési környezetét érintik, amelyek szövegesen az utasításblokkon vagy az operátor zárójelén belül vannak, ahogyan az alábbi példa mutatja:
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.
}
Az előző példában a helyi függvény első meghívása Multiply
azt mutatja, hogy az checked
utasítás nem befolyásolja a függvény túlcsordulás-ellenőrzési környezetét Multiply
, mivel nincs kivétel. A függvény második meghívásakor Multiply
a függvény második argumentumát kiszámító kifejezés egy ellenőrzött környezetben lesz kiértékelve, és kivételt eredményez, mivel szövegesen az utasítás blokkjában checked
van.
A túlcsordulás-ellenőrzési környezet által érintett műveletek
A túlcsordulás-ellenőrzési környezet a következő műveleteket érinti:
A következő beépített számtani operátorok: unary
++
, ,--
and-
binary+
, ,-
, , ,*
és/
operátorok, ha az operandusok integrál típusúak (vagyis integrál numerikus vagy karakter típusúak), vagy számtípust .Explicit numerikus átalakítások az integráltípusok között, vagy egy integráltípusból
float
vagydouble
egy egész típusba.Feljegyzés
Ha egy
decimal
értéket integráltípussá alakít át, és az eredmény a céltípus tartományán kívül esik, OverflowException a rendszer mindig a túlcsordulás-ellenőrzési környezettől függetlenül eldob egy értéket.A C# 11-től kezdve a felhasználó által meghatározott ellenőrzött operátorok és átalakítások. További információt az Aritmetikai operátorok cikk felhasználó által meghatározott ellenőrzött operátorok szakaszában talál.
Alapértelmezett túlcsordulás-ellenőrzési környezet
Ha nem adja meg a túlcsordulás-ellenőrzési környezetet, a CheckForOverflowUnderflow fordítóbeállítás értéke határozza meg a nem állandó kifejezések alapértelmezett környezetét. Alapértelmezés szerint ennek a beállításnak az értéke nem halmaz, és az integrál típusú aritmetikai műveletek és átalakítások nem ellenőrzött környezetben lesznek végrehajtva.
Az állandó kifejezések kiértékelése alapértelmezés szerint egy ellenőrzött környezetben történik, és túlcsordulás esetén fordítási időhiba lép fel. A konstans kifejezéshez explicit módon megadhat egy nem ellenőrzött környezetet az utasítással vagy operátorral unchecked
.
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
- Az ellenőrzött és a nem ellenőrzött utasítások
- Az ellenőrzött és a nem ellenőrzött operátorok
- Felhasználó által megadott ellenőrzött és nem ellenőrzött operátorok – C# 11
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: