Megosztás a következőn keresztül:


Az ellenőrzött és a 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. Az összeadás például 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 átalakítások túlcsordulási viselkedése 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ípustól checked és unchecked a művelettől függ a viselkedése. Az egész számok esetében is az olyan műveletek, mint unchecked(x / 0) a dobás, mert nincs értelmes viselkedés. Ellenőrizze a típus és a művelet viselkedését annak megértéséhez, hogy a kulcsszavak és unchecked a checked kód milyen hatással vannak a kódra.

Numerikus típusok és túlcsordulás-ellenőrzési környezet

A checked kulcsszavak elsősorban unchecked olyan integráltípusokra vonatkoznak, ahol ésszerű túlcsordulási viselkedés tapasztalható. A körbefuttatási viselkedés, amely T.MaxValue + 1 két egymást kiegészítő értékben ésszerűvé válik T.MinValue . 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ítettségi értékekkel PositiveInfinity rendelkezik az és NegativeInfinitymellett, hogy észlelhesse a túlcsordulást egy unchecked környezetben. Mert decimalilyen korlátok nem léteznek, és a telítettség MaxValue hibákhoz vagy keveredéshez vezethet. A használatban lévő decimal műveletek mind a környezetbe, mind a környezetbe bedobnak checked unchecked .

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:

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ések kiértékelése alapértelmezés szerint egy ellenőrzött környezetben történik, és a túlcsordulás fordítási időt eredményez. 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:

Lásd még