102

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

这也迫使我在我自己的类中使用 int 作为长度属性,因为当你指定一个 int 值时,这需要显式转换......

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

4

5 回答 5

66

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

看这里:

框架 1.1

.NET Framework 类库简介

框架 2.0

.NET Framework 类库概述

于 2008-08-08T19:50:14.987 回答
54

很多原因:

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

我认为这也可能与在较低级别上简化事情有关,因为如果 Array.Length 是无符号的,Array.Length 当然会在某个时候添加到负数,并添加到负整数(二进制补码) ,可能会出现混乱的结果。

于 2008-08-08T20:05:07.467 回答
1

似乎没有人提供“终极问题”的答案。

我相信无符号整数的主要用途是提供与外部系统(P/Invoke 等)的更轻松接口,并满足移植到 .NET 的各种语言的需求。

于 2008-10-13T15:23:42.283 回答
-2

通常,整数值是有符号的,除非您明确需要无符号值。这只是它们的使用方式。我可能不同意这个选择,但事实就是如此。

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

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

于 2008-08-08T19:40:31.587 回答