2013-12-20 10 views

答えて

40

エリックリッペルトは、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ブロック、ブロック内の関数呼び出しではありません)。

関連する問題