Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么.NET在某些类中使用int而不是uint?_C#_.net - Fatal编程技术网

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

C# 为什么.NET在某些类中使用int而不是uint?,c#,.net,C#,.net,我经常遇到使用int进行.Count等操作的代码,即使是在框架类中,也没有使用uint 原因是什么?int,在c语言中,被专门定义为处理器的默认整数类型,因此被认为是通用数字运算的最快类型。UInt32并非如此,因此它可能不适用于所有针对通用语言规范的语言Int32符合CLS,因此保证在所有语言中都存在。一些旧库甚至InStr使用负数表示特殊情况。我相信要么是它的惰性,要么是它有负的特殊值。有些东西使用int,这样它们就可以返回-1,好像它是“null”或类似的东西。就像一个组合框,如果没有选择

我经常遇到使用
int
进行
.Count
等操作的代码,即使是在框架类中,也没有使用
uint


原因是什么?

int,在c语言中,被专门定义为处理器的默认整数类型,因此被认为是通用数字运算的最快类型。

UInt32
并非如此,因此它可能不适用于所有针对通用语言规范的语言
Int32
符合CLS,因此保证在所有语言中都存在。

一些旧库甚至
InStr
使用负数表示特殊情况。我相信要么是它的惰性,要么是它有负的特殊值。

有些东西使用int,这样它们就可以返回-1,好像它是“null”或类似的东西。就像一个组合框,如果没有选择任何项目,它将返回-1作为它的SelectedIndex。

使用
int
的另一个原因:

假设您有一个
for
-循环,如下所示:

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

显然,如果
someList.Count
为零且
无符号
,则会出现问题。

如果该数字本质上是无符号的,则我会将其声明为无符号整数。但是,如果我恰好使用了正范围内的数字(目前),则我会将其称为整数

主要原因是:

  • 它避免了大量类型转换,因为大多数方法/函数都是以int而不是无符号int编写的
  • 它消除了可能的截断警告
  • 你总是希望你能给你原本认为永远是正数的数字分配一个负值
只是我脑海中闪现的一些快速的想法


我曾经试着非常小心地选择正确的未签名/已签名,但我最终意识到这并不会带来积极的好处。这只会产生额外的工作。那么,为什么要通过混合和匹配使事情变得困难呢。

UInt32不符合CLS


我认为多年来人们已经得出结论,使用无符号类型并没有带来多少好处。更好的问题是,将计数设为UInt32会得到什么?

如果有符号值和无符号值的和或积是足以容纳任一操作数的有符号类型,并且如果两个无符号值之间的差是足以容纳任何结果的有符号值,则无符号类型的行为仅类似于整数。因此,大量使用
UInt32
的代码通常需要将值计算为
Int64
。当操作数过大时,有符号整数类型上的操作可能无法像整数一样进行操作,但当操作数过小时,它们的行为会很合理。即使操作数很小,对无符号类型的未移动参数的操作也会带来问题。给定
UInt32 x
例如,如果结果类型为
UInt32
,则不等式
x-1
对于
x==0
将失败;如果结果类型为
Int32
,则不等式
x=0
对于较大的
x
值将失败。只有在类型
Int64
上执行该操作,才能支持这两个不等式


虽然有时以不同于整数运算的方式定义无符号类型的行为是有用的,但表示计数之类的值通常应该使用行为类似于整数的类型——无符号类型通常不会这样做,除非它们小于基本整数类型。

感谢Adam,我确实需要uint的额外范围,但你认为使用它会降低我的应用程序的性能吗?在现代处理器中,不,无符号整数和有符号整数应该差不多。如果存在差异,那么它是边际的,如果您需要每一点性能,那么为您的特定编译器/OS/CPU/等进行基准测试是值得的。不,它不会改变您程序的性能。要得到这样的答案,微基准是你的朋友(我推荐MeasureIt)。在我的计算机上,添加UINT的速度似乎比INT快20%左右(尽管如此小的测量结果并不太可靠)。一般来说,担心这一点会被认为是过早的优化;使用最适合这种情况的方法,并在以后对其进行优化,如果这种方法会对性能产生可测量的影响。@AdamDavis:可以容纳同一符号的任意两个
Int32
值之间算术差的最小类型是
Int32
。要保持两个任意
UInt32
值之间的差异[其自然具有相同的“符号”]需要
Int64
。IMHO.NET可能受益于
UInt31
类型,该类型可以隐式转换为
Int32
。这与C无关,而是与C有关。但这为什么会影响一个人是否使用Int32编写特定语言的代码?如果语言X不接受它,但语言Y接受它,如果我用Y编程,为什么我会关心X?这仅仅是针对用多种语言实现以展示特性的示例,还是出于其他原因,我应该用Y编写X中的限制?公共语言规范的思想是,可以为所有语言提供一个单一的基类库。如果BCL仅使用符合CLS的功能,并且所有语言都支持所有符合CLS的功能,则可以从所有语言使用BCL。如果您希望类库可以从其他语言中使用,而不是用其他语言编写的话,这同样适用于您的类库。@Adam:没有任何规定您的代码必须只符合BCL提供的内容。但是,任何符合CLS的组件都可以使用BCL,因此BCL必须将自身限制为CLS功能。谢谢,但为什么要减去1?因为someList的索引是以零为基础的。我宁愿使用<