[英]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.