为什么计数不是一个无符号整数?

可能重复:
为什么.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?

无符号整数不符合CLS( 公共语言规范 )

有关符合CLS的代码的更多信息,请参阅此链接:

http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

我们从实际的angular度来看这个。

无论好还是坏,signed int都是在.NET中使用的普通inttypes。 在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

  1. 这不符合CLS,很大程度上允许来自不同语言的更广泛的支持。

  2. 带符号的int可以轻松地从使用指针算术的C或C ++中移植代码。

  3. 计数可以是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的语言。