初めてこのキーワードに遭遇しました。それは何を行い、いつ使用すべきですか?C#の "checked"キーワードは何ですか?
int multiply(int i, int j)
{
return checked(i * j);
}
初めてこのキーワードに遭遇しました。それは何を行い、いつ使用すべきですか?C#の "checked"キーワードは何ですか?
int multiply(int i, int j)
{
return checked(i * j);
}
エリックリッペルトは、2部構成のブログ記事を持っている「とは何のために未チェックのキーワードいいのですか?」:Part 1からPart 2
"Checked"は、算術オーバーフローチェックを有効にブロックキーワードです。通常、整数演算がその型が扱うことができる最大値または最小値を超えると、操作はとにかく進み、結果はオドメータのように循環します。ですから、例えば:checked
ブロックにこのスニペットを配置
byte b = byte.MaxValue;
Console.WriteLine(b); // 255 (11111111)
Console.WriteLine(++b); // 0 (00000000)
オーバーフローを防止し、代わりにランタイムがスロー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
キーワードもあります。
オーバーフローチェックは控えめに使用する必要がありますが、as is true of exception handling in generalです。実行時にオーバーフローをチェックするために、それはかなり速く、簡単なチェックを行うためではなく、オーバーフローのチェックをオンにする(大きさのような、オーダー)です:
int multiply(int i, int j)
{
if ((long)int * (long)j > int.MaxValue)
throw new InvalidOperationException("overflow");
return i*j;
}
あなたも、Int64型/長時間のためにこれを行うことができ、 BigInteger
を使用して(これは速く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記事もあります(例えば、オーバーフローのチェックはのみに適用されます即時のc odeブロック、ブロック内の関数呼び出しではありません)。