.NETプリミティブとタイプの階層、なぜこのように設計されたのですか?
質問
.NETに9つの整数タイプがある理由を理解したいと思います。 Char
, Byte
, SByte
, Int16
, UInt16
, Int32
, UInt32
, Int64
, 、 と UInt64
;プラス他の数値タイプ: Single
, Double
, Decimal
;そして、これらすべてのタイプにはまったく関係がありません。
私が最初にC#でコーディングを始めたとき、私は「かっこいい、 uint
タイプ、ネガティブ値が許可されていないときにそれを使用するつもりです」。それから私はAPIが使用されていないことに気付いた uint
しかし int
代わりに、そしてそれ uint
由来していません int
, 、そのため、変換が必要でした。
これらのタイプの現実世界アプリケーションは何ですか?代わりに、 integer
と positiveInteger
?これらは私が理解できるタイプです。年の人の年齢はaです positiveInteger
, 、 それ以来 positiveInteger
のサブセットです integer
いつでも変換が必要です integer
期待されています。
以下は、Xpath 2.0およびXquery 1.0のタイプ階層の図です。あなたが下を見るなら xs:anyAtomicType
数値階層を見ることができます decimal
> integer
> long
> int
> short
> byte
. 。 .NETがこのように設計されていなかったのはなぜですか?新しいフレームワーク「オスロ」は違うでしょうか?
解決
私の推測では、基礎となるハードウェアがそのクラスの階層を破るからでしょう。 (おそらく驚くべきことに)あなたが気にするとき、何度もあります 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を使用します;)