为什么.NET在某些类中使用int而不是uint?

时间:2009-04-23 16:56:17

标签: c# .net

即使在框架类中,我总是遇到使用int.Count等内容的代码,而不是uint

这是什么原因?

9 个答案:

答案 0 :(得分:66)

UInt32不是CLS compliant所以它可能不适用于所有针对公共语言规范的语言。 Int32符合CLS,因此保证以所有语言存在。

答案 1 :(得分:8)

int,在c中,被特别定义为处理器的默认整数类型,因此对于一般数值运算来说是最快的。

答案 2 :(得分:3)

使用int的另一个原因:

假设你有一个像这样的for循环:

for (i = 0; i <= someList.Count - 1; i++) {
  // Stuff
}

(虽然你可能不应该这样做)

显然,如果someList.Count为0且未签名,则会出现问题。

答案 3 :(得分:3)

如果数字的内在性质确实是无符号的,那么我会将它声明为unsigned int。但是,如果我恰好在正范围内使用一个数字(暂时),那么我将其称为int。

主要原因是:

  • 它避免了必须进行大量的类型转换,因为大多数方法/函数被编写为采用int而不是unsigned int。
  • 它消除了可能的截断警告。
  • 你总是希望你可以为你原先认为永远是正面的数字指定一个负值。

只是想到了一些简单的想法。

我曾经尝试过非常小心并选择合适的无符号/签名,我终于意识到它并没有真正带来积极的好处。它只是创造了额外的工作。那么为什么要通过混合和匹配来使事情变得艰难。

答案 4 :(得分:2)

UInt32不符合CLS。 http://msdn.microsoft.com/en-us/library/system.uint32.aspx

我认为多年来人们得出结论,使用无符号类型并没有真正提供那么多好处。更好的问题是,通过将Count设为UInt32会获得什么?

答案 5 :(得分:2)

如果有符号和无符号值的和或乘积是一个足以容纳任一操作数的有符号类型,并且两个无符号值之间的差值是一个大到足以容纳任何值的有符号值,则无符号类型的行为类似于整数。结果。因此,大量使用UInt32的代码经常需要将值计算为Int64。当操作数过大时,有符号整数类型的操作可能无法像整数一样操作,但是当操作数很小时它们将表现得很明智。对无符号类型的未启动参数的操作即使在操作数很小时也会产生问题。例如,给定UInt32 x;,如果结果类型为x-1 < x,则x==0的不等式UInt32将失败,并且对于大{{1},不等式x<=0 || x-1>=0将失败如果结果类型为x,则为value。只有在类型Int32上执行操作时,才能维持两个不等式。

虽然以与整数运算不同的方式定义无符号类型行为有时很有用,但表示计数之类的值通常应使用类似于整数的类型 - 无符号类型通常不会执行的操作除非它们小于基本整数类型。

答案 6 :(得分:1)

有些东西使用int,因此它们可以返回-1,好像它是“null”或类似的东西。像ComboBox一样,如果没有选择任何项目,它的SelectedIndex将返回-1。

答案 7 :(得分:0)

一些旧图书馆甚至InStr使用负数来表示特殊情况。我相信它的懒惰或负面的特殊价值。

答案 8 :(得分:0)

就BCL而言,如果Count与SelectedIndex和IndecOf(foo)的类型不同,那将会很尴尬,并且它们可以是-1。

更一般地说,如果编译器构建器必须将注意力集中在一件事上,他们将选择常用的int而不是稀有的uint。