Array.Length が uint ではなく int であるのはなぜですか [重複]
質問
この質問にはすでに答えがあります:
なぜですか Array.Length
int ではなく、 uint
. 。長さの値は決して負の値にはならないので、これは (少しだけ) 気になります。
また、これは自分のクラスで長さのプロパティにINTを使用することを余儀なくされました。なぜなら、INT値を指定すると、これを明示的にキャストする必要があるからです。
したがって、究極の質問は次のとおりです。unsigned int の用途はありますか (uint
)?Microsoftさえもそれらを使用していないようです。
解決
Unsigned int は CLS に準拠していないため、このプロパティの使用は、 UInt
.
ここを参照してください:
フレームワーク 1.1
フレームワーク 2.0
他のヒント
多くの理由:
- uint は CLS に準拠していないため、組み込み型 (配列) をそれに依存させると問題が発生します。
- 当初の設計どおりのランタイムでは、ヒープ上のオブジェクトが 2GB を超えるメモリを占有することは禁止されています。この制限以下の最大サイズの配列は new byte[int.MaxValue] となるため、正ではあるが不正な配列長を生成できることは人々にとって困惑するでしょう。
- この制限は、 4.5 リリースでは若干削除されました, ただし、int としての標準の長さは残ります。
- 歴史的に、C# はその構文と規則の多くを C および C++ から継承しています。これらの配列では単純なポインター演算が行われるため、負の配列インデックス付けが可能でした (ただし、通常は違法で危険です)。既存のコードの多くは配列インデックスが署名されていることを前提としているため、これが要因となっていた可能性があります。
- 関連する注意として、C/C++ で配列インデックスに符号付き整数を使用するということは、これらの言語およびアンマネージ関数との相互運用では、いずれにしてもそのような状況で int を使用する必要があることを意味し、矛盾により混乱する可能性があります。
- BinarySearch の実装 (多くのアルゴリズムの非常に便利なコンポーネント) は、値が見つからなかったことを示すために int の負の範囲を使用できることに依存しています。 そして 並べ替えを維持するためにそのような値を挿入する場所。
- 配列を操作する場合、既存のインデックスの負のオフセットを取得することがよくあります。ユニットを使用して配列の先頭を超えるオフセットを使用した場合、ラップアラウンド動作により、インデックスが正当になる可能性があります (正の値であるという点で)。int の場合、結果は不正になります (ただし、ランタイムが無効なメモリの読み取りを防ぐため安全です)。
Array.Length が符号なしで負の int (2 の補数) に追加される場合、Array.Length は当然、ある時点で負の数に追加されるため、下位レベルでの単純化にも関係している可能性があると思います。 、乱雑な結果になる可能性があります。
「究極の質問」には誰も答えを示さなかったようだ。
unsigned int の主な用途は、外部システム (P/Invoke など) とのインターフェイスを容易にすることと、.NET に移植されるさまざまな言語のニーズに対応することだと思います。
通常、符号なしの値が明示的に必要な場合を除き、整数値は符号付きです。それは単にそれらが使用される方法です。私はその選択に同意できないかもしれませんが、それがまさにその通りです。
当面は、今日の一般的なメモリ制約により、配列または同様のデータ構造に UInt32 の長さが必要な場合は、他のデータ構造を検討する必要があります。
バイト配列の場合、Int32 は 2GB の値を提供します。