为什么Array.Length是一个int,而不是一个uint

为什么Array.Length是一个int,而不是一个uint 。 这使我困扰(只是一点点),因为长度值永远不会消极。

这也迫使我在我自己的类的长度属性使用int,因为当你指定一个int值,这需要明确强制转换…

所以最终的问题是:是否有任何使用unsigned int( uint )? 即使微软似乎也没有使用它们。

无符号整型不符合CLS,因此将该属性的使用限制为那些实现UInt语言。

看这里:

框架1.1

.NET Framework类库介绍

Framework 2.0

.NET Framework类库概述

很多原因:

  • uint不符合CLS,因此依赖于它的内置types(数组)会产生问题
  • 最初devise的运行时间禁止占用超过2GB内存的堆上的任何对象。 由于最大大小的数组小于或等于这个限制将是新的字节[int.MaxValue],这将是令人费解的人们能够产生积极但非法的数组长度。
    • 请注意,这个限制已经在4.5版本中被删除了 ,虽然标准的Length仍然是int。
  • 历史上C#从C和C ++中inheritance了它的大部分语法和约定。 在这些数组中只是指针算术,所以负数组索引是可能的(虽然通常是非法和危险的)。 由于许多现有的代码假定数组索引是被签名的,这将是一个因素
  • 在相关说明中,在C / C ++中对数组索引使用带符号整数意味着与这些语言和非托pipe函数进行交互将会要求在这些情况下使用整数,这可能由于不一致而混淆。
  • BinarySearch实现(许多algorithm的一个非常有用的组件)依赖于能够使用int的负范围来指示没有find该值以及为了维持sorting而应该插入这样的值的位置。
  • 在数组上操作时,您可能希望获取现有索引的负偏移量。 如果你使用了一个偏移量,它会使你通过数组的开始,那么环绕行为将会使你的索引可能是合法的(在这里是正数)。 使用int时,结果将是非法的(但由于运行时会防止读取无效的内存,因此安全)

我认为它也可能与简化的事情在较低的水平,因为Array.Length当然会被添加到一个负数在某些时候,如果Array.Length是无符号的,并添加到负int(二进制补码) ,可能会有混乱的结果。

看起来没人提供“最终问题”的答案。

我相信主要使用未签名的整数是为了提供与外部系统(P / Invoke之类)更容易的接口,并且涵盖被移植到.NET的各种语言的需求。

通常,整数值是有符号的,除非你明确需要一个无符号的值。 这只是他们使用的方式。 我可能不同意这个select,但事实就是这样。

就目前而言,在今天典型的内存约束下,如果你的数组或类似的数据结构需要一个UInt32的长度,你应该考虑其他的数据结构。

用一个字节数组,Int32会给你2GB的值