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

doe*_*man 87 .net c# int uint

为什么是Array.Lengthint,而不是uint.这让我感到困扰(只是一点点),因为长度值永远不会是负数.

这也迫使我在我自己的类上使用int作为length-property,因为当你指定一个int值时,这需要显式地转换...

所以最终的问题是:对于unsigned int(uint)有什么用?甚至微软似乎也没有使用它们.

Kev*_*Kev 60

Unsigned int不符合CLS,因此会将属性的使用限制为那些实现a的语言UInt.

看这里:

框架1.1

.NET Framework类库简介

框架2.0

.NET Framework类库概述


Shu*_*oUk 48

很多原因:

  • uint不符合CLS,因此使内置类型(数组)依赖于它会产生问题
  • 最初设计的运行时禁止堆上的任何对象占用超过2GB的内存.由于小于或等于此限制的最大大小的数组将是新的字节[int.MaxValue],因此人们能够生成正但非法的数组长度将是令人费解的.
  • 从历史上看,C#从C和C++继承了它的大部分语法和约定.在那些数组中只是指针算术,因此负数组索引是可能的(尽管通常是非法的和危险的).由于现有的许多代码都假定数组索引已经签名,因此这将是一个因素
  • 在相关的注释中,在C/C++中对数组索引使用有符号整数意味着与这些语言和非托管函数互操作将需要在这些情况下使用整数,这可能由于不一致而混淆.
  • BinarySearch实现(许多算法中非常有用的组件)依赖于能够使用int的负范围来指示未找到该值以及应该插入此类值以保持排序的位置.
  • 在数组上操作时,您可能希望对现有索引进行负偏移.如果你使用了一个偏移量,它将使你超过使用单位的数组的开始,那么环绕行为将使你的索引可能合法(因为它是正的).使用int结果将是非法的(但是安全,因为运行时将防止读取无效的内存)

  • 如果堆上的任何内容都不能超过2Gb,那么几乎所有长度为int.MaxValue的数组都是非法的,因为大多数类型都大于1个字节. (2认同)
  • 从一个明确的ArrayIndex类型(基本上是size_t)开始,可以根据需要干净利落地安全地转换为int,这可能会使将来更容易实现允许> 2GB阵列,以减少痛苦.但语用学说java有同样的问题所以为什么要承担风险 (2认同)