C#がデフォルトで算術オーバーフローチェックを使用しないのはなぜですか?
エラーが不明瞭にならないように、例外が発生したときに例外を発生させる方が一般的には良いと思います。発生する「ラッピング」動作を利用すると便利な場合があることは知っていますが、unchecked
このような状況では、意図を明確にするためにキーワードを使用できます。
この決定は、おそらく他のCベースの言語との互換性を高めるために意図的に行われたと思います。
C#がデフォルトで算術オーバーフローチェックを使用しないのはなぜですか?
エラーが不明瞭にならないように、例外が発生したときに例外を発生させる方が一般的には良いと思います。発生する「ラッピング」動作を利用すると便利な場合があることは知っていますが、unchecked
このような状況では、意図を明確にするためにキーワードを使用できます。
この決定は、おそらく他のCベースの言語との互換性を高めるために意図的に行われたと思います。
C#言語仕様は次のように述べています。
checked
orunchecked
演算子またはステートメントで囲まれていない非定数式(実行時に評価される式)の場合、デフォルトのオーバーフローチェックコンテキストはunchecked
、外部要因(コンパイラスイッチや実行環境構成など)がchecked
評価を要求しない限りです。
この選択の理由はおそらくパフォーマンスです。私は、この決定が「サイレント」整数オーバーフローを認識していない人々の間でエラーにつながることに同意します。
C#ファイルがC#プロジェクトファイル()に属している場合*.csproj
、そのファイルは「デフォルト」のオーバーフローチェックコンテキストの構成を保持します。変更するには、このページの「VisualStudio開発環境でこのコンパイラオプションを設定するには」を参照してください。
ファイルを使用しない場合.csproj
は、おそらくコマンドラインからすべてをコンパイルしているはずです。次に、上のページに、デフォルトのオーバーフローチェックコンテキストを設定するために使用するコマンドラインオプションが示されています。
ここで同様の質問に対する私の回答を参照してください: C# で整数オーバーフローを処理するための最良の方法は?
...チェック済みおよびチェックなし以外の式の処理方法を定義する C# コンパイラ オプションがあります: /checked.
デフォルトの動作は、ほとんどのアプリケーションに適しています。厳密なチェックがデフォルトである必要がある他のアプリケーションでは、そのような動作を有効にするコンパイラ オプションがあります。