关于c#:使用无符号原始类型

关于c#:使用无符号原始类型

Using Unsigned Primitive Types

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

1
int length;

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

1
uint length;

我能想到的一些缺点:

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

有什么想法吗?


"在罗马做到入乡随俗。"

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

由于一致性通常很重要,因此我建议您走C#路并使用int


第二点是最重要的。通常,您应该只使用int,因为对于整数值而言,这是一个非常不错的"包罗万象"。如果您绝对需要能够计数高于int的功能,而不会使用long所需的额外内存,则我只会使用uint(它不会占用太多内存,所以不要便宜:-p)。


如果递减值为0的带符号数字,该数字将变为负数,您可以轻松地对此进行测试。如果递减值为0的无符号数字,它将下溢并成为该类型的最大值-有点难以检查。


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

对于内部代码(即,在任何互操作性庄园中不会与其他语言一起引用的代码),我投票赞成在情况许可时使用无符号,例如前面提到的length变量。这与经过检查的算法一起,为开发人员提供了一个新的网络,从而较早地捕获了细微的错误。

有符号与无符号辩论中的另一点是,某些程序员使用-1这样的值来表示错误,而这些错误原本就没有含义。我赞成这样一种观点,即每个变量都应仅具有一个目的,但是,如果您(或与您一起编码的同事)喜欢以这种方式表示错误,则使变量保持签名可以使您灵活地在以后添加错误状态。


我认为,除非将uint与int巧妙地结合使用,否则会引起开发人员的困惑,除非将其写入公司的开发人员指南中。

例如,如果长度不能小于零,则应在业务逻辑中清楚地表示它,以便将来的开发人员可以阅读代码并知道真正的意图。

只是我的2美分。


您的两点很好。避免它的主要原因是强制转换。投射使它们难以使用。我曾经尝试使用单符号变量一次,但由于框架方法都使用带符号整数,因此我不得不在所有地方都强制使用强制转换。因此,无论何时调用框架方法,都必须进行强制转换。


推荐阅读

    查看linux库类型命令?

    查看linux库类型命令?,系统,工作,信息,状态,电脑,命令,工具,代码,地址,发行,

    linux网卡类型命令?

    linux网卡类型命令?,网络,系统,地址,信息,设备,状态,服务,名称,名字,网卡,如

    linux终端命令符号?

    linux终端命令符号?,系统,终端,设备,流向,概念,命令,符号,用户,表示,代表,Lin

    linux查看命令类型用?

    linux查看命令类型用?,信息,系统,情况,命令,实时,工作,设备,电脑,文件,类型,

    linux命令三种类型?

    linux命令三种类型?,工作,地址,系统,标准,时间,管理,命令,目录,信息,文件,lin

    linux按符号查找命令?

    linux按符号查找命令?,系统,命令,字符串,灵活,工具,文件,文件名,选项,参数,

    linux命令中的符号?

    linux命令中的符号?,系统,数据,档案,电脑,标准,符号,命令,除法,变量,表示,lin

    linux命令中逻辑符号?

    linux命令中逻辑符号?,系统,标准,数据,资料,命令,用户,符号,权限,所有者,变

    Python整除符号

    Python整除符号,数字,数据,系统,简介,整数,教育,时间,位置,名字,公司,python

    python的数据类型

    python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.

    python的动态类型

    python的动态类型,代码,系统,类型,技术,培训,语言,静态,动态,错误,大发,为了

    Python集合类型

    Python集合类型,检测,位置,培训,元素,对象,实例,成员,操作,子集,类型,python

    Python的动态类型

    Python的动态类型,数据,数字,对象,情况,对比,培训,赋值,字符串,元素,整数,在