Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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. Az alapértelmezett utasítás a következő unchecked: . 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 bejelölt környezetben a rendszer egy System.OverflowException elemet dob. Ha egy állandó kifejezésben túlcsordulás történik, fordítási időhiba lép fel. Nem ellenőrzött környezetben a művelet eredménye csonkul, ha elveti a céltípusba nem illő, felsőbbrendű biteket. Például az összeadás eredménye a maximális értékről a minimális értékre ugrik át. 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 túlcsordulási viselkedése eltérhet az előző bekezdésben leírt viselkedéstő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.
A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
Egy kifejezés túlcsordulás-ellenőrzési környezetének megadásához használhatja az és checked az unchecked 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 Multiply függvény második meghívásakor a második argumentumot kiszámító kifejezés egy ellenőrzött környezetben lesz kiértékelve, és mivel szövegesen az checked utasítás blokkjában van, kivételt eredményez.
checked és unchecked viselkedése a típustól és a művelettől függ. Az egész számok esetében az olyan műveletek, mint a unchecked(x / 0), mindig hibát okoznak, mert nincs értelmes viselkedés. Ellenőrizze a típus és a művelet viselkedését, hogy megértse, hogyan befolyásolják a checked és unchecked kulcsszavak a kódját.
Numerikus típusok és túlcsordulás-ellenőrzési környezet
A checked és unchecked kulcsszavak elsősorban olyan integráltípusokra vonatkoznak, ahol ésszerű túlcsordulás kezelése tapasztalható. A körbefutás viselkedése, amelyben T.MaxValue + 1T.MinValue-vé válik, ésszerű a kettes komplemens érték esetén. Az ábrázolt érték nem helyes , mivel nem fér el a típus tárolójában. Ezért a bitek a teljes eredmény alsó n-bitjeire jellemzőek.
Az olyan típusok esetében, mint a decimal, float, doubleés Half amelyek összetettebb értéket vagy egy kiegészítő értéket jelölnek, a wraparound nem ésszerű. Nem használható nagyobb vagy pontosabb eredmények kiszámítására, ezért unchecked nem előnyös.
float, double és Half ésszerű telítődési értékekkel rendelkezik PositiveInfinity és NegativeInfinity részére, így észlelheti a túlcsordulást unchecked környezetben. Mivel decimal ilyen korlátok nem léteznek, a MaxValue való telítettség hibákhoz vagy zavarhoz vezethet. A decimal műveletek mind a checked, mind a unchecked környezetben kivételt dobnak.
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
++,--,-és binary+,-,*és/operátorok, ha az operandusaik integrált típusúak (vagyis integrál numerikus vagy karakter típusúak) vagy felsorolt típusúak.Explicit numerikus átalakítások az integráltípusok között, vagy egy integráltípusból
floatvagydoubleegy egész típusba.Feljegyzés
Amikor egy
decimalértéket integrált típusra alakítunk, és az eredmény a céltípus tartományán kívül esik, mindig OverflowException kivétel keletkezik, függetlenül a túlcsordulás-ellenőrzési környezettől.Felhasználó által megadott ellenőrzött operátorokat és konverziókat használhat. 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 konzisztens 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éseket alapértelmezés szerint ellenőrzött környezetben értékelik ki, és túlcsordulás esetén fordítási idejű hibát okoz. Az utasítással vagy operátorral explicit módon megadhatja az állandó kifejezések nem ellenőrzött környezetét 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