关于c#:使用无符号原始类型

关于c#:使用无符号原始类型

Using Unsigned Primitive Types

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

1
int length;

该名称很好地表达了其用途,但您可以为其指定负值。 似乎在某些情况下,您可以通过这样编写来更清楚地表达您的意图:

1
uint length;

我能想到的一些缺点:

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

有什么想法吗?


"在罗马做到入乡随俗。"

从理论上讲,在适用的情况下使用无符号值是有好处的,因为它使代码更具表现力,但这在C#中根本无法做到。我不确定为什么开发人员最初不设计接口来处理uints并使其符合CLS类型,但是现在火车已经离开了车站。

由于一致性通常很重要,因此我建议您走C#路并使用int


第二点是最重要的。通常,您应该只使用int,因为对于整数值而言,这是一个非常不错的"包罗万象"。如果您绝对需要能够计数高于int的功能,而不会使用long所需的额外内存,则我只会使用uint(它不会占用太多内存,所以不要便宜:-p)。


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


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

对于内部代码(即,在任何互操作性庄园中不会与其他语言一起引用的代码),我投票赞成在情况许可时使用无符号,例如前面提到的length变量。这与经过检查的算法一起,为开发人员提供了一个新的网络,从而较早地捕获了细微的错误。

有符号与无符号辩论中的另一点是,某些程序员使用-1这样的值来表示错误,而这些错误原本就没有含义。我赞成这样一种观点,即每个变量都应仅具有一个目的,但是,如果您(或与您一起编码的同事)喜欢以这种方式表示错误,则使变量保持签名可以使您灵活地在以后添加错误状态。


我认为,除非将uint与int巧妙地结合使用,否则会引起开发人员的困惑,除非将其写入公司的开发人员指南中。

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

只是我的2美分。


您的两点很好。避免它的主要原因是强制转换。投射使它们难以使用。我曾经尝试使用单符号变量一次,但由于框架方法都使用带符号整数,因此我不得不在所有地方都强制使用强制转换。因此,无论何时调用框架方法,都必须进行强制转换。


推荐阅读