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

C# 为什么Count不是无符号整数?,c#,.net,C#,.net,可能的重复项: 我一直想知道为什么.Count不是一个无符号整数而不是一个有符号整数 例如,以ListView.SelectedItems.Count为例。元素的数量不能小于0,为什么它是有符号整数 如果我尝试测试是否选择了元素,我想测试 if (ListView.SelectedItems.Count == 0) {} 但是因为它是一个有符号整数,我必须测试它 if (ListView.SelectedItems.Count <= 0) {} if(ListView.Sele

可能的重复项:

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

例如,以
ListView.SelectedItems.Count
为例。元素的数量不能小于0,为什么它是有符号整数

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

 if (ListView.SelectedItems.Count == 0) {}
但是因为它是一个有符号整数,我必须测试它

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

if(ListView.SelectedItems.Count无符号整数不符合CLS()

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


可能是因为uint数据类型不是CLS(公共语言规范)的一部分,因为并非所有.Net语言都支持它

以下是关于阵列的非常类似的线程:


让我们从实用的角度来看这一点

> > >或> > > < >代码> int > />代码> s,是.NET中使用的<>强> < > > > int > />代码> s。在C和C++中使用符号<代码> INT/EXEC>S也是正常的。因此,除非有一个很好的理由,否则大多数变量被声明为“代码> int <代码> >,除非有一个很好的理由。

在无符号的
int
和有符号的
int
之间转换存在问题,而且并不总是安全的

在32位系统上,集合中不可能有接近2^^32个项,因此有符号的
int
在所有情况下都足够大

在64位系统上,无符号的
int
不会给您带来太多好处,在大多数情况下,有符号的
int
仍然足够大,否则您需要使用64位的
int
(我希望没有一个标准集合能够很好地处理64位系统上接近2^^31项的内容!)

因此,既然使用无符号的
int
没有明显的优势,为什么要使用无符号的
int

  • 它不符合CLS,主要是为了允许来自不同语言的更广泛支持

  • 一个符号int提供了在使用指针算术的C或C++中移植代码的便利性。

  • Count可以是表达式的一部分,其中总值可以为负值。特别是,Count与索引有直接关系,其中有效索引始终在[0,Count-1]范围内,但一些二进制搜索方法(包括BCL提供的方法)会使用负值结果反映应插入新项目以维持秩序的位置


  • 在vb.net中,正常循环结构(“For/Next循环”)将使用指定的最大值执行循环,这与C不同,C可以轻松使用低于上限的值进行循环。因此,通常需要将循环指定为“For I=0 to Array.Length-1”;如果Array.Length为无符号且为零,则可能会导致一个明显的问题。即使在C语言中,也可以说“for(i=Array.Length-1;i GE 0;--i)”这句话。有时我认为使用31位整数类型会很有用,它可以支持将强制转换扩展到有符号和无符号整数,但我从未听说过有语言支持这样的转换。

    我想这是出于方便,因为您无法将uint强制转换为整数,而且大多数人习惯于将整数用于索引器……您仍然可以测试
    ==0,但是,对吗?因为,正如你所指出的,它永远不会小于0。毕竟,在某些时候,你的代码会做出一些基本的假设,即其他人的代码将以成员名称所暗示的方式运行。我要说,这使你能够假设
    Count
    永远不会小于0,并检查f或者平等。和重复的,虽然这回答了问题的字母,它没有解释。也许问题应该是,“为什么它不符合CLS?”这确实是一个奇怪的决定。为什么uint不符合CLS的问题是一个单独问题的主题,这里已经有人问过了:没错!!VB是不同的:在VB中,true一词是0,false一词是-1。根据这个公理,-1是一个整数,不能用无符号整数来表示。这显然是一个CPU优化问题!!VB是不同的:在VB中,术语true是0,术语false是-1。根据这一公理,-1是一个int,不能用无符号int来表示。我认为使用整数的有符号版本而不是无符号int的原因显然是CPU优化问题:带零的数字具有负值-1。例如,logica中的NOT门l scheme在如何表示值等于零或为空方面非常有效。@user1587368:(2的补码)带符号int的优点是,无论大小,此类类型的“所有位集”值都是-1,而无符号类型的每个大小都有不同的“所有位集”价值。我看到一个明显的优势:当某人犯错误时,例如
    (Names.Count<0)
    (而不是
    (Names.Count>0)
    )编译器可以发出警告。我认为警告用户犯错误是编译器的一项非常重要的任务,任何使其更容易检测错误的语言都比竞争对手具有优势。事实上,这就是为什么我首先更喜欢编译语言的原因。这种解释站不住脚。你不可能有负数ems在列表/字典/等中,因此将Count设为int是愚蠢的。