共用方式為


已核取和未核取的語句 (C# 參考)

checkedunchecked 陳述式會指定整數型別算術運算和轉換的溢位檢查內容。 預設語句是 unchecked。 發生整數算術溢位時,溢位檢查內容會定義會發生什麼情況。 在已檢查的上下文中,會拋出System.OverflowException;如果常數運算式發生溢位,則會造成編譯時錯誤。 在未檢查的上下文中,操作結果會通過捨棄不適合目標型別的高序位位元來截斷。 例如,加法會將最大值換行至最小值。 下列範例顯示在檢查過和未檢查上下文中的相同操作:

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.
}

注意

用戶定義運算子和轉換的溢位行為可能會與上一段中所述的行為不同。 特別是,使用者定義的檢查運算子可能不會在已檢查的情境中擲回例外狀況。

如需詳細資訊,請參閱算術運算子一文的算術溢位和除以零,以及使用者定義檢查運算子一節。

若要指定運算式的溢位檢查內容,您也可以使用 checkedunchecked 運算子,如下列範例所示:

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.
}

checkedunchecked 陳述式和運算子只會影響那些在陳述式區塊或運算子括弧內部字面上的作業的溢位檢查上下文,如下列範例所示:

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.
}

在上述範例中,Multiply 本機函式的第一次調用顯示,checked 陳述式不會影響 Multiply 函式內的溢位檢查的上下文,因為不會擲回例外狀況。 在第二次調用 Multiply 函式時,計算函式第二個引數的運算式會在受檢查的上下文中進行評估,結果由於它位於 checked 陳述式區塊內,導致拋出例外狀況。

checkedunchecked 的行為取決於類型和操作。 即使是整數,像 unchecked(x / 0) 這樣的運算都會拋出異常,因為沒有合理的行為。 檢查類型和操作的行為,以瞭解 checkedunchecked 關鍵字如何影響您的程式碼。

數值類型和溢位檢查的上下文

checkedunchecked 關鍵詞主要適用於有合理溢位行為的整數型別。 在二的補碼值中,T.MaxValue + 1 包覆成 T.MinValue 的行為是合理的。 表示的值不正確,因為它無法放入型別的記憶體中。 因此,這些位元代表完整結果的低 n 位元。

對於 decimalfloatdoubleHalf 類型,這些類型代表更複雜的值或一個一補碼值,循環並不合理。 它無法用來計算更大或更精確的結果,因此 unchecked 並無好處。

floatdoubleHalf 對於 PositiveInfinityNegativeInfinity 具有合理的飽和值,因此您可以在 unchecked 的環境中偵測溢位。 針對 decimal,不存在這類限制,而飽和於 MaxValue 可能會導致錯誤或混淆。 在使用 decimal 時,操作會在 checkedunchecked 環境中拋出。

受溢位檢查內容影響的作業

溢位檢查上下文會影響以下操作:

預設溢位檢查內容

如果您未指定溢位檢查內容,CheckForOverflowUnderflow 編譯程式選項的值會定義非常數表達式的默認內容。 根據預設,該選項的值是 unset ,且整數類型算術運算和轉換會在 unchecked 的內容中執行。

常數表達式會在已檢查的上下文中預設進行評估,如果發生溢出將導致編譯時錯誤。 您可以使用 unchecked 陳述式或運算子,在常數運算式中明確指定 unchecked 上下文。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱