大多数时候,我们表示的概念永远不会小于 0。例如,要声明长度,我们可以这样写:

int length;

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

uint length; 

我能想到的一些缺点:

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

想法?

有帮助吗?

解决方案

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

虽然理论上在适用的情况下使用无符号值具有优势,因为它使代码更具表现力,但在 C# 中根本无法做到这一点。我不知道为什么开发人员最初没有设计接口来处理 uints 并使类型 CLS 兼容,但现在火车已离开车站。

由于一致性通常很重要,我建议采用 C# 方式并使用 ints。

其他提示

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

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

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

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

只是我的2分钱。

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

对于内部代码(即不会在与其他语言的任何互操作庄园中引用的代码),当情况允许时,我投票支持使用 unsigned,例如 length 变量如前所述。这与检查算术一起为开发人员提供了多一张网,可以更早地发现细微的错误。

有符号与无符号争论中的另一点是,一些程序员使用诸如 -1 之类的值来指示错误,而这些值本来没有意义。我同意每个变量应该只有一个用途的观点,但如果您或与您一起编码的同事喜欢以这种方式指示错误,则对变量进行签名可以让您以后灵活地添加错误状态。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top