C# 中的數字分隔符 _


編寫 C# 代碼時,我們時常會用到很大的數字,例如下面定義的變量:

const long loops = 50000000000;

您能快速讀出這是多少嗎?是不是還是會有很多人把光標定位到最后一位,然后按鍵盤上的向左鍵一個一個往上數:個、十、百、千、萬、十萬、百萬、千萬、億、十億、百億、千億……

reading large number

數字的這種寫法,嚴重影響了它的可讀性。所以人們才會發明了諸如千分位之類的寫法,上面的數字用千分位可以寫作 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 之間

總結

在定義較大的數字時,使用下划線 _ 作為分隔符,可以讓較長的數字更具可讀性。這個功能雖然很微不足道,但當你用到它的時候,易讀性會讓你的心情愉快很多,不是嗎?

下划線分隔符 _ 在語義上對運行沒有任何影響,因為它在編譯的時候就被編譯器忽略了。


作者 : 技術譯民
出品 : 技術譯站


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM