使用无符号原始类型

时间:2008-08-29 02:28:57

标签: c# primitive-types

大多数时候,我们代表永远不会少于0的概念。例如,为了声明长度,我们写道:

int length;

该名称很好地表达了其目的,但您可以为其指定负值。在某些情况下,您可以通过这种方式更清楚地表达您的意图:

uint length; 

我能想到的一些缺点:

  • 无符号类型(uint,ulong,ushort)不符合CLS,因此您无法将其与其他不支持此语言的语言一起使用
  • .Net类大部分时间都使用签名类型,因此您必须强制转换

思想?

6 个答案:

答案 0 :(得分:5)

如果您使用值0减去带符号的数字,它将变为负数,您可以轻松地对此进行测试。如果使用值0递减无符号数,则它会下溢并成为该类型的最大值 - 稍微更难检查。

答案 1 :(得分:5)

你的第二点是最重要的。通常你应该只使用int,因为对于整数值来说这是一个非常好的“全能”。我只会使用uint,如果你绝对需要能够计算高于int,但不使用额外的内存long需要(它不是更多的内存,所以不要便宜:-P)。

答案 2 :(得分:5)

“在罗马时,像罗马人那样做。”

虽然理论上在使用无符号值时有一个优势,因为它使代码更具表现力,但这并不是用C#来完成的。我不确定为什么开发人员最初没有设计接口来处理uints并使类型符合CLS,但现在火车离开了车站。

由于一致性通常很重要,我建议采用C#之路并使用int s。

答案 3 :(得分:2)

我认为uint与int的微妙使用会引起开发人员的困惑,除非它被写入公司的开发人员指南中。

例如,如果长度不能小于零,则应在业务逻辑中清楚地表达,以便将来的开发人员可以阅读代码并了解真实意图。

只需2美分。

答案 4 :(得分:2)

我将指出在C#中你可以打开/checked来检查算术溢出/下溢,这无论如何都不是一个坏主意。如果性能在关键部分很重要,您仍然可以使用unchecked来避免这种情况。

对于内部代码(即任何互操作庄园中不会引用其他语言的代码),我会在情况需要时投票使用unsigned,例如前面提到的length变量。这与检查算术一起为开发人员提供了一个网络,可以更早地捕捉到微妙的错误。

签名与无签名辩论中的另一点是,一些程序员使用-1这样的值来表示错误,否则他们就没有意义。我订阅了这个视图,即每个变量应该只有一个目的,但如果您 - 或者您编写代码的同事 - 喜欢用这种方式表示错误,那么保留签名变量可以让您以后灵活地添加错误状态。

答案 5 :(得分:0)

你的两点都很好。不过,避免它的主要原因是施法。铸造使它们使用起来非常烦人。我曾尝试使用一次unisigned变量,但我不得不在任何地方撒上强制转换,因为框架方法都使用有符号整数。因此,无论何时调用框架方法,都必须进行强制转换。