我经常遇到使用 int
来处理 .Count
等内容的代码,即使在框架类中也是如此,而不是使用 uint
。
这是什么原因呢?
UInt32
不符合 CLS 兼容性规范,因此可能无法在所有目标通用语言规范的语言中使用。而 Int32
符合 CLS 兼容性规范,因此可以保证在所有语言中都存在。
在C语言中,int被特别定义为处理器的默认整型类型,因此被认为是执行一般数值操作最快的类型。
Int32
值之间算术差异的最小类型是Int32
。要容纳两个任意UInt32
值之间的差异[自然具有相同的“符号”],则需要一个Int64
。在我看来,.NET可能会受益于一个UInt31
类型,它可以隐式转换为Int32
。 - supercatUInt32
的代码通常需要将值计算为 Int64
。当操作数过大时,有符号整数类型的运算可能无法像整数一样运作,但当操作数很小时,它们将表现得很明智。即使操作小型操作数的未提升参数上的操作也会带来问题。例如,给定 UInt32 x;
,如果结果类型为 UInt32
,则不等式 x-1 < x
将在 x==0
时失败,而如果结果类型为 Int32
,则不等式 x<=0 || x-1>=0
将在大的 x
值时失败。只有在类型 Int64
上执行操作时,才能同时保持这两个不等式。
尽管有时定义无符号类型行为以与整数算术不同的方式很有用,但表示像计数之类的事物的值通常应使用将表现得像整数的类型,除非它们比基本整数类型更小,否则无符号类型通常不会这样做。
有些东西使用int类型,这样它们就可以返回-1,就像“null”或类似的东西一样。例如,如果ComboBox没有选中任何项,则其SelectedIndex属性将返回-1。
UInt32不符合CLS标准。http://msdn.microsoft.com/en-us/library/system.uint32.aspx
我认为多年来人们得出的结论是使用无符号类型并没有带来太多好处。更好的问题是,通过将计数器设置为UInt32会获得什么好处?