题
这个问题已经有一个答案在这里:
为什么 Array.Length
int,而不是一个 uint
.这让我困扰的(只是有点),因为一定长度的价值永远不可能是负面的。
这也迫使我利用一个int为一种长度的财产,在我自己的类,因为当你 指定一个int-值,这需要投明确...
所以最终的问题是:是否有任何用于unsigned int(uint
)?即使微软似乎不到使用它们。
解决方案
其他提示
原因有很多:
- uint是不符合CLS,因此使一个建立在类型(array)依赖它会一直有问题
- 运行时作为最初设计禁止的任何物堆上占多2GB的存储器。由于最大型阵列,将小于或等于该限额将是新的字节[int。MaxValue]这将是令人费解的人能够产生积极的,但非法的阵列的长度。
- 注意,这种限制已 有点删除的4.5版本, 虽然标准长度为int仍然存在。
- 从历史上看C#继承其语法和《公约》C和C++。在这些阵列是简单地指针算法使负面阵列索引是可能的(虽然通常非法和危险)。由于很多现有的码的假定列索引是签署这将是一个因素
- 在一个相关的请注意使用的签署整数列中的索引C/C++意味着互操作与这些语文并非管理职能将需要利用整数在这些情况无论如何,这可能会混淆由于不一致。
- BinarySearch执行情况(一个非常有用的组成部分的许多算法)依赖于能够使用负范围的int表明的价值是找不到 和 在哪个位置这样一个数值应加入维持的排序。
- 工作时就一系列很可能你会想要采取一个负偏的一个现有的索引。如果你使用了抵消这将带你去开始阵列,使用单元,然后包围的行为会让你的索引可能的法律(在于它是正)。有一个int的结果将是非法的(但由于安全运行时将防止阅读的无效存储器)
我认为这也可能需要有简化的东西在一个较低的水平,因为阵列。长当然将加入为负数,在某一点,如果阵列。长度是未签名,并加入到负int(两个补),有可能是混乱的结果。
看起来像没有人提供的答案为"最终的问题"。
我认为,主要用unsigned int是提供更容易与外部系统(P/援引等等)和涵盖的需要的各种语言的移植。网。
通常,整数值的签署,除非明确需要一个未签署的价值。这只是他们的方式使用。我可能不同意这一选择,但这只是事情是这样的。
目前,与今天的典型存储器的约束,如果你阵或相似的数据结构需要一个UInt32长,你应该考虑其他数据结构。
与一系列字节,Int32会给你2GB值
不隶属于 StackOverflow