C# 中的數字分隔符 _

技術譯民發表於2020-11-17

編寫 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 之間

總結

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

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


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

相關文章