为什么计数不是一个无符号整数?
可能重复:
为什么.NET在某些类中使用int而不是uint?
为什么Array.Length是一个int,而不是一个uint
我总是想知道为什么.Count
不是一个无符号的整数而不是一个有符号的整数?
例如,采取ListView.SelectedItems.Count
。 元素的数量不能小于0,那么为什么它是一个有符号整数?
如果我试图testing是否有元素select,我想testing
if (ListView.SelectedItems.Count == 0) {}
但是因为它是一个有符号的整数,我必须testing
if (ListView.SelectedItems.Count <= 0) {}
或者有什么情况下.Count
可以<0?
我们从实际的angular度来看这个。
无论好还是坏,signed int
都是在.NET中使用的普通的int
types。 在C和C ++中使用signed int
也是正常的。 所以,大多数variables被声明为int
而不是unsigned int
除非有其他的好理由。
在unsigned int
和signed int
之间转换有问题,并不总是安全的。
在一个32位的系统中,一个集合不可能有任何地方接近2 ^^ 32个项目, 所以一个有符号int
在所有情况下都足够大 。
在一个64位的系统上,一个无符号的int
并不会带来太多的收益,在大多数情况下,一个有符号的int
仍然足够大,否则你需要使用一个64位的int
。 (我希望没有一个标准的集合可以很好地处理64位系统上2 ^ ^ 31个项目的任何地方!)
因此,鉴于使用unsigned int
没有明显的优势,为什么要使用unsigned int
?
Mabye,因为uint数据types不是CLS(通用语言规范)的一部分,因为并不是所有.Net语言都支持它。
这里是关于数组的非常类似的线程:
为什么Array.Length是一个int,而不是一个uint
-
这不符合CLS,很大程度上允许来自不同语言的更广泛的支持。
-
带符号的int可以轻松地从使用指针算术的C或C ++中移植代码。
-
计数可以是expression式的一部分,其中整体值可以是负值。 具体而言,count与指数有直接的关系,有效指标总是在[0,Count – 1]的范围内,但是例如一些二分查找方法(包括BCL提供的)应该插入一个新的项目来维持秩序。
在vb.net中,正常循环构造(“For / Next循环”)将执行循环,其值不超过指定的最大值,不像C,它可以很容易地以低于上限的值循环。 因此,经常需要指定一个循环,例如“For I = 0 To Array.Length-1”。 如果Array.Length是无符号的,并且为零,那可能会导致一个明显的问题。 即使在C中,也可以说“for(i = Array.Length-1; i GE 0; – i)”。 有时候我认为有一个31位的整数types可以支持扩展转换为signed和unsigned int,但是我从来没有听说过支持这种types的语言。