簡體   English   中英

C#“checked”關鍵字的作用是什么?

[英]What is the C# “checked” keyword for?

我只是第一次遇到這個關鍵字。 它有什么作用,應該在什么時候使用?

int multiply(int i, int j)
{
    return checked(i * j);
}

Eric Lippert 有一篇由兩部分組成的博客文章“unchecked 關鍵字有什么用?”: 第 1 部分—— 第 2 部分


“Checked”是啟用算術溢出檢查的塊關鍵字。 通常,如果整數運算超過該類型可以處理的最大值或最小值,則運算仍會繼續,結果就像里程表一樣循環。 因此,例如:

byte b = byte.MaxValue;
Console.WriteLine(b);       // 255  (11111111)
Console.WriteLine(++b);     // 0    (00000000)

將此代碼段放在已checked塊中可以防止溢出,相反,運行時會拋出一個OverflowException

checked
{
    byte b = byte.MaxValue;
    Console.WriteLine(b);               // b=255
    try
    {
        Console.WriteLine(++b);
    }
    catch (OverflowException e)
    {
        Console.WriteLine(e.Message);   // "Arithmetic operation resulted in an overflow." 
                                        // b = 255
    }
}

由於有一個編譯器選項/checked ,它默認打開編譯器檢查,還有unchecked關鍵字可以防止溢出檢查。


就用法而言,應該謹慎使用溢出檢查, 就像一般的異常處理一樣 要在運行時檢查溢出,進行簡單檢查比打開溢出檢查要快得多(例如,一個數量級):

int multiply(int i, int j)
{ 
    if ((long)i * (long)j > int.MaxValue)
        throw new InvalidOperationException("overflow");
    return i*j;
}

您甚至可以使用BigInteger對 Int64/long 執行此操作(這仍然至少比使用checked快一個數量級):

long multiply(long i, long j)
{ 
    if (new System.Numerics.BigInteger(i) + j > long.MaxValue)
        throw new InvalidOperationException("overflow");
    return i*j;
}

還有一篇很好的Code Project文章解釋了一些注意事項(例如,溢出檢查僅適用於直接代碼塊,而不適用於塊內的任何函數調用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM