7

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

int length;

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

uint length; 

我能想到的一些缺点:

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

想法?

4

6 回答 6

5

如果您减少一个值为 0 的有符号数,它会变为负数,您可以轻松地对此进行测试。如果你减少一个值为 0 的无符号数,它会下溢并成为该类型的最大值——检查起来有点困难。

于 2008-08-29T02:32:37.277 回答
5

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

于 2008-08-29T02:33:04.030 回答
5

“在罗马,做罗马人做的事。”</p>

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

由于一致性通常很重要,我建议走 C# 路并使用ints.

于 2008-08-29T07:22:37.987 回答
2

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

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

只是我的2美分。

于 2008-08-29T02:34:59.253 回答
2

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

对于内部代码(即不会在与其他语言的任何互操作庄园中引用的代码),我投票赞成在情况允许时使用无符号,例如length前面提到的变量。这 - 连同检查算术 - 为开发人员提供了更多的网络,更早地发现了细微的错误。

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

于 2008-08-29T05:29:32.000 回答
0

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

于 2008-08-29T06:21:07.947 回答