なぜArray.Length
はintであり、uint
ではないのですか?長さの値が決して負にならないので、これは私を悩ます(ほんの少し)。 なぜArray.Lengthは整数ではなく、整数ではない
だから究極の質問は...あなたがint値を指定する とき、これは明示的にキャストする必要があるため、自分のクラスに長さプロパティのint型を使用するように私を余儀なくさ:無署名のint(uint
)のための使用はありますか?マイクロソフトでさえそれらを使用していないようです。
なぜArray.Length
はintであり、uint
ではないのですか?長さの値が決して負にならないので、これは私を悩ます(ほんの少し)。 なぜArray.Lengthは整数ではなく、整数ではない
だから究極の質問は...あなたがint値を指定する とき、これは明示的にキャストする必要があるため、自分のクラスに長さプロパティのint型を使用するように私を余儀なくさ:無署名のint(uint
)のための使用はありますか?マイクロソフトでさえそれらを使用していないようです。
unsigned int型は、CLSに準拠していませんので、UInt
を実装してくださいこれらの言語にプロパティの使用を制限します。
はこちらをご覧ください:
Framework 1.1の
Framework 2.0の
通常、符号なしの値が明示的に必要な場合を除き、整数値には符号が付きます。それは彼らが使用されている方法です。私はその選択に同意しないかもしれませんが、それはまさにその方法です。
当分の間、典型的なメモリの制約により、配列や類似のデータ構造にUInt32の長さが必要な場合は、他のデータ構造も考慮する必要があります。バイトの配列で
、のInt32はあなたの値の2ギガバイトを与える
"だがそれはそれだけである」 - いいえ、物事は決して彼らの方法ではありません。常にデザインの意思決定が行われており、なぜそれを求めているのですか?賛否両論から何かを学んだり、(場合によっては)デザイナーと議論を交わしたりするかもしれません。常に質問してください! :) –
Array.Lengthは符号なしで負のintに追加された場合、Array.Lengthはある時点で負の数に追加されるので、下位レベルでは単純化する必要があるかもしれないと思う補完)、厄介な結果になる可能性があります。
例を挙げてください。 'uint lenght = 3; int x = -4; Console.WriteLine(x + lenght);'は-1を返します。 –
"究極の質問"に誰も答えられなかったようです。
私は、unsigned intの主な用途は外部システム(P/Invokeなど)との簡単なインターフェイスを提供し、.NETに移植されるさまざまな言語のニーズをカバーすることだと考えています。
複数の小さい値を連結して大きな値を生成する場合、符号なしの型は不可欠です。 '(HighPart << 16)+ LowPart'を計算することによって2つのUInt16を組み合わせてUInt32を作ることができ、UInt32を'(Uint16)(Value >> 16) 'と'(Uint16)(Value &65535) 'このような操作は、「LowPart」が署名付きの型でなければならない場合、非常に不便である。言われていることは、署名型と署名なし型の間の相互作用は、しばしば混乱し問題が多いことです。署名のない型は、多くの点で独自の世界とみなされるべきです。 – supercat
多くの理由:
ヒープ上に何も2Gb以上になることができない場合、ほとんどの型は1バイトよりも大きいので、長さint.MaxValueの配列のほとんどすべては不正です。 – ScottS
実際には((uint)(int.MaxValue))+ 1は* anything *に対して間違っていることが保証されます。 intはそれ自体完璧ではありませんが、物事のバランスによって型としてint型を保つことは合法です。 – ShuggyCoUk
explict ArrayIndex型(本質的にsize_t)であれば、必要に応じてきれいに安全にintに変換することができます。将来的には痛みの少ない2GB以上の配列を使用できるようになります。しかし、Javaは同じ問題を抱えているので、なぜリスクを取るのかということについては、 – ShuggyCoUk
問題が発生しても、UIntに変更する必要があります。 – alan2here
@ alan2ここでこのような変更を行うと、ほとんどすべてのコードが破損してしまいますので、私に尋ねれば起こりません! – Peter