编写 C# 代码时,我们时常会用到很大的数字,例如下面定义的变量:

const long loops = 50000000000;

您能快速读出这是多少吗?是不是还是会有很多人把光标定位到最后一位,然后按键盘上的向左键一个一个往上数:个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿……

数字的这种写法,严重影响了它的可读性。所以人们才会发明了诸如千分位之类的写法,上面的数字用千分位可以写作 50,000,000,000,这样子是不是可读性就强多了?不过这是西方人的写法。

如果按照我们中国人的习惯,可以写成 500,0000,0000,是不是一眼就可以读出来是五百亿了?

那么问题来了,我们能不能在代码中这么写来增强数字的可读性呢?

答案是肯定的,不过要稍作改变 —— 把逗号换成下划线 _

const long loops = 500_0000_0000;
// 或者
const long loops = 50_000_000_000;

这是从 C# 7.0 开始支持的功能。它的用法和 Java 及 Python 中的用法是类似的。

当我们使用下划线 _ 作为数字分隔符时,可以把它添加在数字文本中除了第一个字符和最后一个字符之外的任何位置。将下划线添加到长数字的不同的位置,就形成了不同的分组,不同的分组在不同的情景中可能会有不同的意义。比如我们在使用十进制、十六进制或二进制记数法声明数字时,可以加上下划线 _ 字符,使数字更易读懂。

我们来举个例子,定义下面一组数字:

int bin = 0b1001_1010_0001_0100;// 二进制表示
int hex1 = 0x64_95_ED; // 十六进制表示
int hex2 = 0x_64_95_ED; // 十六进制表示
int dec1 = 1_000_000; // 十进制
int dec2 = 100_0000; // 十进制
int weird = 1_2__3___4____5_____6______7_______8________9;
double real = 1_000.111_1e-5;
decimal d = 1_222_345;

上面的这些数字声明编译之后实际运行的代码是:

int bin = 39444;
int hex1 = 6591981;
int hex2 = 6591981;
int dec1 = 1000000;
int dec2 = 1000000;
int weird = 123456789;
double real = 0.010001111;
decimal d = 1222345m;

可以看出,虽然表示结果一样,但是适当地添加了下划线分隔符的写法,大大增加了我们读数的容易程度。

C# 中的任意数字都可以使用下划线分隔,两个连续数字字符之间允许出现多个下划线。 但是有些时候是要注意的,比如在小数和指数中使用时,不能出现在小数点(10_.0)的前后、指数字符(1.1e_1)的前后和类型说明符(10_f)的前面,等等……

我们来看一些错误的用例,下面的用法都是错误的:

double d1 = 1.1_e1;     //不能出现在指数字符前后
float f1 = 10_f; //不能出现在类型说明符前面
double d2 = 10_.0; //不能出现在小数点前后
float pi1 = 3_.1415F; //不能出现在小数点前后
float pi2 = 3._1415F; //不能出现在小数点前后
int x1 = 52_; //不能出现在第一个字符和最后一个字符
int x2 = 0x52_; //不能出现在第一个字符和最后一个字符
int x3 = 0_x52; //不能出现在 0x 之间

总结

在定义较大的数字时,使用下划线 _ 作为分隔符,可以让较长的数字更具可读性。这个功能虽然很微不足道,但当你用到它的时候,易读性会让你的心情愉快很多,不是吗?

下划线分隔符 _ 在语义上对运行没有任何影响,因为它在编译的时候就被编译器忽略了。

作者 : 技术译民

出品 : 技术译站

C# 中的数字分隔符 _的更多相关文章

  1. Swift - 使用下划线(_)来分隔数值中的数字

    为了增强较大数值的可读性,Swift语言增加了下划线(_)来分隔数值中的数字. 不管是整数,还是浮点数,都可以使用下划线来分隔数字. 1 2 3 4 //数值可读性 let value1 = 10_0 ...

  2. Excel 2007中自定义数字格式前要了解的准则

    要在Excel 2007中创建自定义数字格式,首先应了解自定义数字格式的准则,并从选择某一内置数字格式开始.然后,可以更改该格式的任意代码部分,从而创建自己的自定义数字格式. 数字格式最多可包含四个代 ...

  3. java 从String中匹配数字,并提取数字

    方法如下: private List<FieldList> GetTmpFieldsList(List<String> FieldsList,String tmptableNa ...

  4. Vijos_1218_数字游戏_(划分型动态规划+环状动态规划)

    描述 https://vijos.org/p/1218 给出n个数围成一个环,将其划分成k个部分,每个部分求和再对10取模,最后将每个部分的值相乘,求其最大值与最小值. 描述 丁丁最近沉迷于一个数字游 ...

  5. Day2_数字类型_字符串类型_列表类型_元组_字典_集合_字符编码_文件处理

    数字类型: 作用:年纪,等级,薪资,身份证号等: 10进制转为2进制,利用bin来执行. 10进制转为8进制,利用oct来执行. 10进制转为16进制,利用hex来执行. #整型age=10 prin ...

  6. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  7. Day2_数字类型_字符串类型_列表类型

    数字类型: 作用:年纪,等级,薪资,身份证号等: 10进制转为2进制,利用bin来执行. 10进制转为8进制,利用oct来执行. 10进制转为16进制,利用hex来执行. #整型age=10 prin ...

  8. list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较

    //这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...

  9. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

随机推荐

  1. centos 6.4 配置本地yum源(iso镜像)

    1.先挂载 iso镜像  eg: mount -o loop /home/帐号/downloads/CentOS.iso /mnt/iso 2.用管理员帐号备份CentOS-Base.repo   e ...

  2. OpenCV Java Tutorials- Camera Calibration

    2020-10-10原文地址:https://opencv-java-tutorials.readthedocs.io/en/latest/09-camera-calibration.html#id1 ...

  3. 在Jenkins容器中安装docker-compose

    首先使用Docker容器安装Jenkins 链接参考 安装成功后使用管理员权限进入到Jenkins容器 docker exec -it -u root jenkins bash 下载docker-co ...

  4. iNeuOS工业互联平台,设备容器(物联网)改版,并且实现设备数据点的实时计算和预警。发布3.2版本

    目       录 1.      概述... 2 2.      平台演示... 2 3.      设备容器新版本介绍... 2 4.      全局数据计算及预警平台... 3 5.      ...

  5. pytest文档44-allure.dynamic动态生成用例标题

    前言 pytest 结合 allure 描述用例的时候我们一般使用 @allure.title 和 @allure.description 描述测试用例的标题和详情. 在用例里面也可以动态更新标题和详 ...

  6. centos6.8 Mysql5.6.22 升级 mysql-5.7.20

    一.检查系统环境 二.备份数据库 mysqldump –all-databases > allbackupfile.sql (建议:有条件的话可使用图形化界面备份,操作灵活) 三.下载安装文件 ...

  7. Docker结合.Net Core初步使用

    Docker是一项比较流行的容器化技术,可以让开发者将应用以及应用依赖的环境,依赖包一起打包到容器中,然后部署容器到生产环境就可以了,解决了应用程序部署到不同服务器环境带来的问题(很多开发人员都遇到过 ...

  8. servlet post response.sendRedirect 乱码

    response.sendRedircet一般用于传递字符串参数 常会出现乱码: 情景1: post表单提交,跳转后的servlet,通过getParameter(name)进行解码,获取的中文乱码 ...

  9. python中的多(liu)元(mang)交换 ,赋值

    多元赋值 顾名思义 同时对多个变量赋值 长话短说 举例: int x = 1 int y = 2 x,y = y ,x 这种写法可以直接交换x,y的值 非常方(liu)便(mang) 也就是 y=1 ...

  10. 一篇文章搞定Git——Git代码管理及使用规范

    一篇文章搞定Git--Git代码管理及使用规范   https://blog.csdn.net/weixin_42092278/article/details/90448721