使用无符号基元类型

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

int length; 

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

 uint length; 

我能想到的一些缺点:

  • unsigned types(uint,ulong,ushort)不符合CLS,因此您不能将其与其他不支持此语言的语言一起使用
  • .Net类大多数时候都使用签名类型,因此你必须进行强制转换

思考?

“在罗马做到入乡随俗。”

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

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

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

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

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

例如,如果长度不能小于零,那么它应该在业务逻辑中清楚地表达,以便未来的开发人员可以读取代码并知道真正的意图。

只需2美分。

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

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

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

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