.NET原语和类型层次结构,为什么它是这样设计的?

时间:2009-11-05 03:02:48

标签: c# .net primitive

我想了解为什么在.NET上有九种整数类型:CharByteSByteInt16UInt16,{{ 1}},Int32UInt32Int64;加上其他数字类型:UInt64SingleDouble;所有这些类型都没有任何关系。

当我第一次开始使用C#进行编码时,我认为“很酷,有一个Decimal类型,当不允许负值时,我会使用它”。然后我意识到没有使用uint而是使用uint,而int并非来自uint,因此需要进行转换。

这些类型的实际应用是什么?为什么不使用intinteger?这些是我能理解的类型。一个人的年龄为positiveInteger,由于positiveIntegerpositiveInteger的子集,因此只要有integer,就需要进行转换。

以下是XPath 2.0和XQuery 1.0中的类型层次结构图。如果您在integer下查看,则可以看到数字层次结构xs:anyAtomicType> decimal> integer> long> int> short。为什么.NET不是这样设计的?新框架“奥斯陆”会有所不同吗?

alt text

2 个答案:

答案 0 :(得分:4)

我的猜测是因为底层硬件打破了这个类层次结构。当你关心UInt32是4字节大且无符号时,有很多次(或许是令人惊讶的),因此UInt32 不是 Int32Int32也不是Int64

您几乎总是关心intfloat之间的区别。

从根本上说,继承&类层次结构与数学集包含不同。 a UInt32可以容纳的值是Int64可以容纳的值的严格子集,这并不意味着UInt32Int64的类型。不太明显,Int32不是Int64的类型 - 即使它们之间没有概念上的差异,它们的基础表示也是不同的(4个字节对8个字节)。 Decimals更加不同。

XPath是不同的:所有数字类型的表示基本相同 - 一串ASCII数字。在那里,shortlong之间的差异是可能的范围之一而不是表示 - “123”都是short的有效表示,具有相同值的long的有效表示。

答案 1 :(得分:3)

十进制用于需要精确的计算(基本上是金钱)。 见这里:http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx

单打/双打与小数不同,因为它们是一个近似值(基本上用于科学计算)。

这就是为什么他们没有关系。

至于字节和字符,它们完全不同:一个字节是0-255,而字符是一个字符,因此可以存储unicode字符(其中有超过255个字符!)

Uints和int不会自动转换,因为它们每个都可以存储另一个不可能的值(uint的正值范围是正数的两倍)。

一旦掌握了所有内容,它确实很有意义。

至于你的年龄,我只是使用int;)