大多数时候,我们表示的概念永远不会小于 0。例如,要声明长度,我们编写:
int length;
该名称很好地表达了其目的,但您可以为其分配负值。似乎在某些情况下,您可以通过以下方式更清楚地表达您的意图:
uint length;
我能想到的一些缺点:
- 无符号类型(uint、ulong、ushort)不符合 CLS,因此您不能将其与不支持此功能的其他语言一起使用
- .Net 类大部分时间都使用有符号类型,因此您必须强制转换
想法?
大多数时候,我们表示的概念永远不会小于 0。例如,要声明长度,我们编写:
int length;
该名称很好地表达了其目的,但您可以为其分配负值。似乎在某些情况下,您可以通过以下方式更清楚地表达您的意图:
uint length;
我能想到的一些缺点:
想法?
如果您减少一个值为 0 的有符号数,它会变为负数,您可以轻松地对此进行测试。如果你减少一个值为 0 的无符号数,它会下溢并成为该类型的最大值——检查起来有点困难。
你的第二点是最重要的。一般来说,你应该只使用int
它,因为对于整数值来说这是一个很好的“包罗万象”。我只会uint
在您绝对需要计数高于 的能力时int
使用,但不使用额外的内存long
需要(它不是更多的内存,所以不要便宜:-p)。
“在罗马,做罗马人做的事。”</p>
虽然理论上在适用的情况下使用无符号值是有优势的,因为它使代码更具表现力,但这在 C# 中根本没有做到。我不确定为什么开发人员最初没有设计接口来处理uints
和使类型 CLS 兼容,但现在火车已经离开了车站。
由于一致性通常很重要,我建议走 C# 路并使用int
s.
我认为 uint 与 int 的微妙使用会引起开发人员的困惑,除非它被写入公司的开发人员指南中。
例如,如果长度不能小于零,那么它应该在业务逻辑中清楚地表达出来,以便未来的开发人员可以阅读代码并了解真正的意图。
只是我的2美分。
我会指出,在 C# 中,您可以打开/checked
以检查算术上溢/下溢,这无论如何都不是一个坏主意。如果性能在关键部分很重要,您仍然可以使用unchecked
来避免这种情况。
对于内部代码(即不会在与其他语言的任何互操作庄园中引用的代码),我投票赞成在情况允许时使用无符号,例如length
前面提到的变量。这 - 连同检查算术 - 为开发人员提供了更多的网络,更早地发现了细微的错误。
有符号与无符号争论的另一点是,一些程序员使用诸如 -1 之类的值来指示错误,而否则它们没有意义。我赞同每个变量应该只有一个目的的观点,但是如果您 - 或与您一起编写代码的同事 - 喜欢以这种方式指示错误,则让变量签名可以让您灵活地在以后添加错误状态。
你的两点很好。不过,避免它的主要原因是铸造。铸造使它们使用起来非常烦人。我曾经尝试使用无符号变量,但我不得不在任何地方都使用强制转换,因为框架方法都使用有符号整数。因此,无论何时调用框架方法,都必须进行强制转换。