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