6

我想了解为什么在 .NET 上有九种整数类型:Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, 和UInt64; 加上其他数字类型:Single, Double, Decimal; 所有这些类型都没有任何关系。

当我第一次开始用 C# 编码时,我想“很酷,有一种uint类型,当不允许使用负值时,我将使用它”。然后我意识到没有使用 API uint,而是使用了 API int,并且它uint不是从 派生的int,因此需要进行转换。

这些类型的实际应用是什么?为什么不具有,而不是integerpositiveInteger?这些是我能理解的类型。一个人的年龄(以岁为单位)是 a positiveInteger,并且因为positiveInteger是一个子集,integer所以无论何时integer都需要转换。

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

替代文字

4

2 回答 2

4

我的猜测是因为底层硬件破坏了该类层次结构。有很多次(也许令人惊讶)当您关心 aUInt32是 4 字节大且无符号时,因此 aUInt32 不是一种Int32,也不是Int32一种 Int64

而且您几乎总是关心inta 和 a之间的区别float

从根本上说,继承和类层次结构与数学集包含不同。aUInt32可以持有的值是 an 可以持有的值的严格子集这一事实Int64并不意味着 aUInt32是 的类型Int64。不太明显, anInt32不是一种类型Int64- 即使它们之间在概念上没有区别,但它们的底层表示是不同的(4 字节与 8 字节)。 Decimals更加不同。

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

于 2009-11-05T03:38:02.170 回答
3

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

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

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

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

Uint 和 int 不会自动转换,因为它们都可以存储彼此不可能的值(uint 的正数范围是整数的两倍)。

一旦你掌握了这一切,它实际上确实很有意义。

至于你的年龄问题,我会简单地使用一个 int ;)

于 2009-11-05T03:37:37.193 回答