编写 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 之间

总结

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

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

作者 : 技术译民

出品 : 技术译站

最新文章

  1. Sublime相关
  2. C# 多线程 lock 实例
  3. memcached一些整理
  4. 功能测试中遇到的一些有意思的bug
  5. 【转】RTSP流理解
  6. 初识JAVA——流程控制之if语句
  7. poj 3278 搜索
  8. nginx 配置本地https(免费证书)
  9. 吴恩达机器学习笔记25-神经网络的模型表示2(Model Representation of Neural Network II)
  10. mysql修改字段长度及pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")错误
  11. "远程服务器返回错误: (500) 内部服务器错误"错误处理
  12. 数组,集合,字符串,bean,map
  13. Leetcode 970. 强整数
  14. The current identity ( XXXX) does not have write access to ‘C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files’.解决办法
  15. HTML5中的Canvas详解
  16. 【第二十五章】 springboot + hystrixdashboard
  17. shell基础--cat命令的使用
  18. Qt多线程编程中的对象线程与函数执行线程
  19. R语言中的标准输入,输出, 错误流
  20. 【[SHOI2007]园丁的烦恼】

热门文章

  1. 要是想让程序跳转到绝对地址是0x100000去执行
  2. linux块设备驱动---相关结构体(转)
  3. 【转】Linux-CentOS7设置程序开启自启步骤!
  4. spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)
  5. STL: set和map的区别、联系、使用
  6. 记一次JFormDesigner破解问题idea版本号2020.2.2
  7. .net core autofac asyncinterceptor 异步拦截器开发
  8. 第二十七章 ansible变量介绍
  9. vue组件使用name属性来生成递归组件
  10. windows7 安装配置NodeJS、NPM