色んな事を書く

シンプルさを極めたエンジニアになりたい

c# の checked キーワード

c# は規定では算術計算による overflow で例外を発生されません。

overflow とは、扱える範囲の数値を超える状態の事です。

例えば、c# の int 型が取りうる値の範囲は -2,147,483,648 ~ 2,147,483,647 です。

docs.microsoft.com docs.microsoft.com

int で扱える範囲を超した値を int 型の変数に代入すると、overflow が発生するというわけです。

overflow が発生すると計算結果が大幅に狂う事になります。以下のようなプログラムを書いてみます。

int a = Int32.MaxValue;
int b = a + 10;

Console.WriteLine(b);  // -2147483639

表示される値は意図したものとは大きく異なっています。

overflow を起こされると困る場合には、何かしらの方法で検知する必要があります。c# では以下の方法があります。

  • checked キーワードを使う
  • コンパイル時に /checked+ オプションを付ける
checked
{
    int a = Int32.MaxValue;
    int b = a + 10;
    Console.WriteLine(b);
}

というような記述にすると、OverflowException が発生します。

何で checked キーワードが気になったかというと Linq の Select の実装を眺めていると登場したからです。

github.com

内部では int 型変数の index をインクリメントしています。int のサイズを超えるような要素数だと OverflowException が発生するようですね。