.NETプリミティブとタイプの階層、なぜこのように設計されたのですか?

StackOverflow https://stackoverflow.com/questions/1678068

  •  16-09-2019
  •  | 
  •  

質問

.NETに9つの整数タイプがある理由を理解したいと思います。 Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, 、 と UInt64;プラス他の数値タイプ: Single, Double, Decimal;そして、これらすべてのタイプにはまったく関係がありません。

私が最初にC#でコーディングを始めたとき、私は「かっこいい、 uint タイプ、ネガティブ値が許可されていないときにそれを使用するつもりです」。それから私はAPIが使用されていないことに気付いた uint しかし int 代わりに、そしてそれ uint 由来していません int, 、そのため、変換が必要でした。

これらのタイプの現実世界アプリケーションは何ですか?代わりに、 integerpositiveInteger ?これらは私が理解できるタイプです。年の人の年齢はaです positiveInteger, 、 それ以来 positiveInteger のサブセットです integer いつでも変換が必要です integer 期待されています。

以下は、Xpath 2.0およびXquery 1.0のタイプ階層の図です。あなたが下を見るなら xs:anyAtomicType 数値階層を見ることができます decimal > integer > long > int > short > byte. 。 .NETがこのように設計されていなかったのはなぜですか?新しいフレームワーク「オスロ」は違うでしょうか?

alt text

役に立ちましたか?

解決

私の推測では、基礎となるハードウェアがそのクラスの階層を破るからでしょう。 (おそらく驚くべきことに)あなたが気にするとき、何度もあります UInt32 4バイトが大きくて署名されていないので、 UInt32 ではありません のようなもの Int32, 、そうでもありません Int32 ある種類の Int64.

そして、あなたはほとんどいつもの間の違いを気にします int そしてa float.

基本的に、継承とクラスの階層は、数学セットの包含と同じではありません。値がa UInt32 保持できるのは、値の厳格なサブセットです Int64 保持することは、それを意味するものではありません UInt32 タイプのものです Int64. 。それほど明らかではない、 Int32 タイプではありません Int64 - それらの間に概念的な違いはありませんが、それらの根底にある表現は異なります(4バイト対8バイト)。 Decimals さらに違う。

XPathは異なります:すべての数値タイプの表現は根本的に同じです - 一連のASCII桁。そこでは、aの違い short そしてa long の一つであります 可能 表現ではなく範囲 - 「123」は両方ともの有効な表現です short との有効な表現 long 同じ値で。

他のヒント

小数は、精度(基本的にはお金)を必要とする計算を目的としています。ここを参照してください: http://msdn.microsoft.com/en-us/library/364x0z75(vs.80).aspx

シングル/ダブルは小数とは異なります。なぜなら、それらは近似であることを意図しているためです(基本的には、科学的計算の場合)。

それが彼らが関係していない理由です。

バイトとチャーに関しては、それらは完全に異なります。バイトは0-255ですが、charは文字であるため、ユニコード文字を保存できます(255以上があります!)

uintsとintsは、他の人にとって不可能な値を保存する可能性があるため、自動的に変換されません(uintsはintsの正の範囲の2倍です)。

すべてを手に入れると、実際には非常に理にかなっています。

あなたの年齢については、私は単にintを使用します;)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top