我想了解为什么在.NET上有九种整数类型:Char
,Byte
,SByte
,Int16
,UInt16
,{{ 1}},Int32
,UInt32
和Int64
;加上其他数字类型:UInt64
,Single
,Double
;所有这些类型都没有任何关系。
当我第一次开始使用C#进行编码时,我认为“很酷,有一个Decimal
类型,当不允许负值时,我会使用它”。然后我意识到没有使用uint
而是使用uint
,而int
并非来自uint
,因此需要进行转换。
这些类型的实际应用是什么?为什么不使用int
和integer
?这些是我能理解的类型。一个人的年龄为positiveInteger
,由于positiveInteger
是positiveInteger
的子集,因此只要有integer
,就需要进行转换。
以下是XPath 2.0和XQuery 1.0中的类型层次结构图。如果您在integer
下查看,则可以看到数字层次结构xs:anyAtomicType
> decimal
> integer
> long
> int
> short
。为什么.NET不是这样设计的?新框架“奥斯陆”会有所不同吗?
答案 0 :(得分:4)
我的猜测是因为底层硬件打破了这个类层次结构。当你关心UInt32
是4字节大且无符号时,有很多次(或许是令人惊讶的),因此UInt32
不是 Int32
,Int32
也不是Int64
。
您几乎总是关心int
和float
之间的区别。
从根本上说,继承&类层次结构与数学集包含不同。 a UInt32
可以容纳的值是Int64
可以容纳的值的严格子集,这并不意味着UInt32
是Int64
的类型。不太明显,Int32
不是Int64
的类型 - 即使它们之间没有概念上的差异,它们的基础表示也是不同的(4个字节对8个字节)。 Decimals
更加不同。
XPath是不同的:所有数字类型的表示基本相同 - 一串ASCII数字。在那里,short
和long
之间的差异是可能的范围之一而不是表示 - “123”都是short
的有效表示,具有相同值的long
的有效表示。
答案 1 :(得分:3)
十进制用于需要精确的计算(基本上是金钱)。 见这里:http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx
单打/双打与小数不同,因为它们是一个近似值(基本上用于科学计算)。
这就是为什么他们没有关系。
至于字节和字符,它们完全不同:一个字节是0-255,而字符是一个字符,因此可以存储unicode字符(其中有超过255个字符!)
Uints和int不会自动转换,因为它们每个都可以存储另一个不可能的值(uint的正值范围是正数的两倍)。
一旦掌握了所有内容,它确实很有意义。
至于你的年龄,我只是使用int;)