checked 和 unchecked 陳述式 (C# 參考)

checkedunchecked 陳述式會指定整數型別算術運算和轉換的溢位檢查內容。 發生整數算術溢位時,溢位檢查內容會定義會發生什麼情況。 在 checked 內容中,會擲出 System.OverflowException;如果常數運算式發生溢位,則會發生編譯時間錯誤。 在 unchecked 內容中,會捨棄目的型別不適用的高序位位元,以便將作業結果截斷。 例如,新增時會從最大值換行至最小值。 下列範例顯示已核取和未核取內容中的相同作業:

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 陳述式區塊內。

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

溢位檢查內容會影響下列作業:

預設溢位檢查內容

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

常數運算式預設會在 checked 的內容中進行評估,並在溢位時發生編譯時間錯誤。 您可以使用 unchecked 陳述式或運算子,明確指定常數運算式的 unchecked 內容。

C# 語言規格

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

另請參閱