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

Joa*_*nge 50 .net c#

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

这是什么原因?

dtb*_*dtb 67

UInt32符合CLS,因此可能无法在所有针对公共语言规范的语言中使用.Int32符合CLS,因此保证以所有语言存在.

  • 公共语言规范的想法是,您可以为所有语言提供单个基类库.如果BCL仅使用符合CLS的功能,并且所有语言都支持所有符合CLS的功能,则可以使用所有语言的BCL.如果您希望它们可以从其他语言中使用,那么这同样适用于您的类库. (9认同)
  • @Adam:没有任何内容表明你的代码必须只符合BCL提供的内容.但是,BCL适用于任何符合CLS标准的组件,因此BCL必须将自己限制在CLS功能之内. (6认同)
  • 但是为什么这会影响一个人是否使用Int32以特定语言编码?如果语言X不接受它,但Y语言不接受,如果我用Y编程,为什么我会关心X?是仅仅用于以多种语言实现的示例来展示功能,还是有其他原因我应该在Y中使用X中的限制进行编程? (3认同)

Ada*_*vis 7

int,in c,具体定义为处理器的默认整数类型,因此对于一般数值运算而言保持最快.

  • 不,它不会改变您的程序的性能.要获得这样的答案,微基准测试是你的朋友(我推荐MeasureIt).*在我的电脑上*添加uints似乎比整数快20%(虽然这个小的测量不太可靠).总的来说,担心这一点会被认为是过早优化; 使用适合最佳情况的任何内容,如果它会导致_measurable_性能影响,请稍后对其进行优化. (6认同)
  • 在现代处理器中,unsigned int和signed int应该大致相同.如果存在差异,那么它是微不足道的,如果您需要每一个最后一盎司的性能,那么值得为您的特定编译器/ OS/CPU /等进行基准测试. (4认同)

sup*_*cat 6

仅当有符号和无符号值的和或乘积是足够大以容纳任一操作数的有符号类型,并且两个无符号值之间的差是足够大以容纳任何结果的有符号值时,无符号类型才像整数一样工作。因此,大量使用 的代码UInt32经常需要将值计算为Int64。当操作数太大时,对有符号整数类型的操作可能无法像整数一样操作,但当操作数很小时,它们的行为会很合理。即使操作数很小,对无符号类型的未提升参数的操作也会产生问题。例如,如果结果类型为,则UInt32 x;不等式x-1 < x将失败;如果结果类型为 ,则不等式将因大值而失败。只有对类型进行运算才能维持两个不等式。x==0UInt32x<=0 || x-1>=0xInt32Int64

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