102

なぜArray.Lengthint ではなくuint. 長さの値が負になることは決してないため、これは私を(少しだけ)悩ませます。

これにより、自分のクラスの長さプロパティに int を使用することも余儀なくされました。これは、int 値を指定するときに、これを明示的にキャストする必要があるためです...

したがって、究極の質問は、unsigned int ( ) の用途はありますuintか? マイクロソフトでさえ、それらを使用していないようです。

4

5 に答える 5

66

unsigned int は CLS に準拠していないため、このプロパティの使用は を実装する言語に制限されますUInt

ここを参照してください:

フレームワーク 1.1

.NET Framework クラス ライブラリの概要

フレームワーク 2.0

.NET Framework クラス ライブラリの概要

于 2008-08-08T19:50:14.987 に答える
54

多くの理由:

  • uintはCLSに準拠していないため、組み込み型(配列)をそれに依存させることは問題がありました。
  • 当初設計されたランタイムは、2GBを超えるメモリを占有するヒープ上のオブジェクトを禁止します。この制限以下になる最大サイズの配列はnewbyte[int.MaxValue]になるため、正のが不正な配列の長さを生成できるようになると、人々は困惑します。
  • 歴史的に、C#はその構文と規則の多くをCとC++から継承しています。これらの配列では、単純にポインタ演算であるため、負の配列インデックスが可能でした(通常は違法で危険ですが)。多くの既存のコードは、配列インデックスが署名されていることを前提としているため、これが要因でした。
  • 関連する注意点として、C / C ++の配列インデックスに符号付き整数を使用するということは、これらの言語やアンマネージ関数との相互運用には、とにかくそのような状況でintを使用する必要があり、不整合のために混乱する可能性があることを意味します。
  • BinarySearchの実装(多くのアルゴリズムの非常に便利なコンポーネント)は、intの負の範囲を使用して、値が見つからなかったこと、並べ替えを維持するためにそのような値を挿入する場所を示すことができることに依存しています。
  • 配列を操作する場合、既存のインデックスの負のオフセットを取りたいと思う可能性があります。ユニットを使用して配列の開始を超えるオフセットを使用した場合、ラップアラウンド動作により、インデックスが正当なものになる可能性があります(正の値であるという点で)。intを使用すると、結果は違法になります(ただし、ランタイムが無効なメモリの読み取りを防ぐため、安全です)
于 2009-01-29T13:15:42.737 に答える
1

Array.Length が符号なしで負の int (2 の補数) に追加された場合、Array.Length はもちろんある時点で負の数に追加されるため、下位レベルで物事を単純化することにも関係している可能性があると思います。 、厄介な結果になる可能性があります。

于 2008-08-08T20:05:07.467 に答える
1

「究極の質問」に対する答えは誰も提供していないようです。

unsigned int の主な用途は、外部システム (P/Invoke など) とのインターフェイスを容易にし、.NET に移植されるさまざまな言語のニーズに対応することだと思います。

于 2008-10-13T15:23:42.283 に答える
-2

通常、符号なしの値が明示的に必要でない限り、整数値は符号付きです。それは彼らが使われる方法です。私はその選択に同意しないかもしれませんが、それはまさにその通りです。

当分の間、今日の一般的なメモリの制約により、配列または同様のデータ構造に UInt32 の長さが必要な場合は、他のデータ構造を検討する必要があります。

バイト配列の場合、Int32 は 2GB の値を提供します

于 2008-08-08T19:40:31.587 に答える