大多数时候,我们代表永远不会少于0的概念。例如,为了声明长度,我们写道:
int length;
该名称很好地表达了其目的,但您可以为其指定负值。在某些情况下,您可以通过这种方式更清楚地表达您的意图:
uint length;
我能想到的一些缺点:
思想?
答案 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变量,但我不得不在任何地方撒上强制转换,因为框架方法都使用有符号整数。因此,无论何时调用框架方法,都必须进行强制转换。