Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用无符号基元类型_C#_Primitive Types - Fatal编程技术网

C# 使用无符号基元类型

C# 使用无符号基元类型,c#,primitive-types,C#,Primitive Types,大多数情况下,我们表示的概念不能小于0。例如,要声明长度,我们写: int length; 这个名字很好地表达了它的目的,但是你可以给它赋值。似乎在某些情况下,您可以通过以下方式更清楚地表达您的意图: uint length; 我能想到的一些缺点: 未签名类型(uint、ulong、ushort)不符合CLS,因此您不能将其用于不支持此功能的其他语言 .Net类大部分时间使用有符号类型,因此必须强制转换 想法?如果将一个有符号的数字的值减为0,它将变为负数,您可以很容易地对此进行测试。

大多数情况下,我们表示的概念不能小于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