为什么Count不是无符号整数?

时间:2010-09-07 12:15:20

标签: c# .net

  

可能重复:
  Why does .NET use int instead of uint in certain classes?
  Why is Array.Length an int, and not an uint

我一直想知道为什么.Count不是无符号整数而不是有符号整数?

例如,取ListView.SelectedItems.Count。元素的数量不能小于0,那么为什么它是一个signed int?

如果我尝试测试是否选择了元素,我想测试

 if (ListView.SelectedItems.Count == 0) {}

但因为它是有符号整数,我必须测试

 if (ListView.SelectedItems.Count <= 0) {}

或者.Count是否可以&lt; 0?

5 个答案:

答案 0 :(得分:53)

无符号整数不符合CLS(Common Language Specification

有关符合CLS的代码的详细信息,请参阅以下链接:

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

答案 1 :(得分:6)

Mabye因为uint数据类型不是CLS(通用语言规范)的一部分,因为并非所有.Net语言都支持它。

这是关于数组的非常类似的线程:

Why is Array.Length an int, and not an uint

答案 2 :(得分:5)

让我们从实际角度来看这个。

无论好坏,签名int是.NET中使用的正常int。在C和C ++中使用带符号的int也是正常的。因此,除非有充分的理由,否则大多数变量都被声明为int而不是无符号int

在未签名的int和签名的int之间进行转换存在问题,但并不总是安全的。

在32位系统上,集合不可能有近2 ^^ 32个项目,所以签名int在所有情况下都足够大

在64位系统上,无符号int对您没有多大帮助,在大多数情况下,签名int仍然足够大,否则您需要使用64位int(我希望64系统上没有任何一个标准集合能够很好地应对2 ^^ 31个项目!)

因此,如果使用未签名的int没有明显的优势,为什么要使用未签名的int

答案 3 :(得分:3)

  1. 它不符合CLS,主要是为了提供更多不同语言的支持。

  2. signed int可以轻松地从使用指针算法的C或C ++移植代码。

  3. Count可以是表达式的一部分,其中整体值可以为负数。特别地,count与索引具有直接关系,其中有效索引总是在[0,Count-1]的范围内,但是使用例如否定结果。通过一些二进制搜索方法(包括BCL提供的方法)来反映应该插入新项目的位置以维持秩序。

答案 4 :(得分:0)

在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位整数类型会很有用,它可以支持扩展转换为signed和unsigned int,但我从来没有听说过支持这种语言的语言。