負の配列サイズでスローされたオーバーフローエクセプトの背後にある理論的根拠?
-
04-10-2019 - |
質問
次のようなコードを書いた後:
var size=-1;
var arr=new byte[size];
私はそれが投げられたことに驚いた オーバーフローエクセプト. 。のドキュメント オーバーフローエクセプト 州:
この例外のために、アレイの長さがどのようにマイナスサイズを提供するかが説明されている説明にどのように適合するかはわかりませんでした。
寸法長の計算値は次のように検証されます。 1つ以上の値がゼロ未満の場合、System.OverFlowExceptionがスローされ、それ以上のステップは実行されません。
なぜOverflowexceptionが選ばれたのだろうか。あなたが私に尋ねると、それはかなり誤解を招きます。少なくとも5分間の調査にかかりました(ここで私の黙想を数えません)。誰もがこれ(私の思考に)独特のデザインの決定に光を当てることができますか?
解決
これはほぼ間違いなく最適化です。 .NETフレームワークコードは、プログラマーが成功のピットに落ちるように議論をチェックすることについてかなり宗教的です。しかし、それは無料ではありません。コストはかなり小さいです。多くのクラスの方法は、チェックに費やされるよりもはるかに多くの機械サイクルを必要とします。
しかし、配列は特別です。これらは、フレームワークの非常にコアデータ構造です。ほぼすべてのコレクションクラスは、その上に構築されています。アレイクラスに入れるオーバーヘッドは、その上にある多くのコードの効率に直接影響します。小切手を避けるのは大丈夫です。内部コードが符号なしに値をキャストする必要がある場合、とにかく暗黙的にチェックされます。そして、それが旅行することは非常にまれです。したがって、それを2回チェックすることは、より良い例外メッセージに価値がありません。
他のヒント
オーバーフローエクセプト, 、ドキュメントでは、基本的にオーバーフローを次のものとして定義します。
データ型の範囲外の結果を生成します
この場合、負の値は、配列サイズ(または実際には任意のサイズ)の有効な範囲外です。
私はその議論を見ることができました argupoutofRangeException ある意味では、より良いかもしれませんが、アレイ定義に関係する議論はありません(方法ではないため)。したがって、それも完全な選択ではありません。
そのサイズが署名されていないINTであるためかもしれません。 2つの補数に-1を保存します。これは、署名されていないINTと見なされると、保存できる最大の正の整数です。この数値が配列の可能性のあるサイズよりも大きい場合、オーバーフローします。
警告:これは純粋な憶測です。