使用无符号原语类型

时间:2020-03-05 18:44:48  来源:igfitidea点击:

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

int length;

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

uint length;

我能想到的一些缺点:

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

有什么想法吗?

解决方案

回答

如果递减值为0的带符号数字,该数字将变为负数,我们可以轻松地对此进行测试。如果递减值为0的无符号数字,它会下溢并成为某种类型的最大值,这种类型的数字更难检查。

回答

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

回答

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

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

只是我的2美分。

回答

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

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

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

回答

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

回答

在罗马做到入乡随俗。

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

因为一致性通常很重要,所以我建议我们采用Croad并使用ints。