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

时间:2008-08-08 19:34:14

标签: c# .net int uint

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

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

所以最终的问题是:unsigned int(uint)有用吗?即使是微软似乎也不会使用它们。

5 个答案:

答案 0 :(得分:59)

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

见这里:

框架1.1

  

Introduction to the .NET Framework Class Library

Framework 2.0

  

.NET Framework Class Library Overview

答案 1 :(得分:48)

很多原因:

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

答案 2 :(得分:1)

我认为这也可能与简化较低级别的事情有关,因为如果Array.Length是无符号的,则Array.Length当然会在某个时刻被添加到负数,并添加到负数int(两个补充),可能会有凌乱的结果。

答案 3 :(得分:1)

看起来没人能回答“最终的问题”。

我认为无符号整数的主要用途是提供更容易与外部系统(P / Invoke等)的接口,并涵盖移植到.NET的各种语言的需求。

答案 4 :(得分:-1)

通常,除非明确需要无符号值,否则将对整数值进行签名。这就是它们的使用方式。我可能不同意这个选择,但这就是它的方式。

目前,对于今天的典型内存限制,如果您的数组或类似数据结构需要UInt32长度,则应考虑其他数据结构。

使用字节数组,Int32将为您提供2GB的值