为什么Array.Length是int而不是uint
时间:2020-03-05 18:38:40 来源:igfitidea点击:
为什么Array.Length是int而不是uint。这使我感到困扰(一点点),因为长度值永远不能为负。
这也迫使我在我自己的班级上使用int作为长度属性,因为当我们
指定一个int值,这需要显式转换...
所以最终的问题是:unsigned int(uint
)有什么用吗?甚至微软似乎都不使用它们。
解决方案
回答
通常,整数值是带符号的,除非我们明确需要一个无符号的值。这就是它们的使用方式。我可能不同意这种选择,但这就是事实。
目前,在当今典型的内存限制下,如果数组或者类似数据结构需要UInt32长度,则应考虑其他数据结构。
使用字节数组,Int32将为我们提供2GB的值
回答
Unsigned int不符合CLS,因此会将属性的使用限制为那些确实实现UInt的语言。
看这里:
框架1.1
Introduction to the .NET Framework Class Library
框架2.0
.NET Framework Class Library Overview
回答
我认为这也可能与简化底层操作有关,因为如果Array.Length是无符号的,则Array.Length当然会在某个时候添加到负数,并添加到负int(二进制补码) ,结果可能会混乱。
回答
似乎没有人提供对"最终问题"的答案。
我相信无符号整数的主要用途是使与外部系统(P / Invoke等)的接口更容易,并满足移植到.NET的各种语言的需求。
回答
很多原因:
- uint不符合CLS,因此使依赖于它的内置类型(数组)存在问题
- 从历史上看,C#继承了C和C ++的大部分语法和约定。在这些数组中,只是指针算术运算,因此可以进行负数组索引(尽管通常是非法和危险的)。由于许多现有代码都假定数组索引是带符号的,因此这将是一个因素
- 与此相关的是,在C / C ++中对数组索引使用带符号整数意味着在这些情况下与这些语言和非托管函数的互操作无论如何都将需要使用int,这可能会由于不一致而造成混淆。
- BinarySearch实现(许多算法中非常有用的组件)依赖于能够使用int的负数范围来指示未找到该值以及应插入该值的位置以保持排序。
- 在数组上进行操作时,我们可能希望对现有索引取负数偏移量。如果我们使用的偏移量将使我们超过使用unit的数组开头,那么回绕行为将使索引可能合法(因为它是正数)。使用int时,结果将是非法的(但很安全,因为运行时将防止读取无效的内存)