C# 字面值 二進制字面值與數(shù)字分隔符
無論編程語法有多復雜,計算機都只能以兩種狀態(tài)——0和1來工作,這就是人們所熟知的二進制(基數(shù)為 2)。如果愿意,可以將所有的程序都編碼為由1和0組成的序列,之后再運行程序。雖然這種方式既不實用也 不值得推薦,但這樣做可以將減輕解釋器的負擔,讓解釋器不用再從C#、十進制(基數(shù)為10)、八進制(基數(shù)為 8)或十六進制(基數(shù)為16)等對程序進行轉(zhuǎn)換。這樣做并沒有多大好處,所以必須認識到只有在非常特殊的情況 下才會用到二進制表示法。例如,可能需要以二進制、十六進制或ASCII碼的形式將一些值傳遞給第三方的代 碼包。大部分情況下,除非確實需要二進制字面值,否則還是應該使用C#等編程語言來編寫代碼。
深入理解了有關(guān)半字節(jié)、位、字節(jié)、字符、字、二進制、八進制、十六進制等字面值的技術(shù)知識和歷史背 景,才能夠深入理解何時、在什么地方、如何以及為什么使用這些字面值。我們不會深入探討“為什么使用” 這個歷史問題,也不會深入探討“如何使用”這個專業(yè)問題?,F(xiàn)在明白下面這樣的問題就己經(jīng)足夠,例如,可 以將二進制字面值作為一種優(yōu)雅方法,在進行模式匹配和比較時將值存儲為常量,還可以用來實現(xiàn)位掩碼。如 下面代碼行中對二進制和十六進制所做的對比所示,可以發(fā)現(xiàn),二進制數(shù)字從右往左循環(huán)移動一位。十六進制 值不存在模式,所以很難快速確定代碼的意圖。
int[] binaryPhases = [ ObOOllOOOl, ObOllOOOlO, ObllOOOlOO, OblOOOlOOl ];
int[] hexPhases = [ 0x31, 0x62/ 0xC4, 0x89 ];
為了更好地理解C# 7的二進制字面值,以下面的代碼為例:
int[] numbers = [ lf 2, 4, 8, 16 ];
在C#7中,可以直接以二進制的形式向numbers數(shù)組添加值,如下所示:
int[] numbers = [ ObOOOl, ObOOlO, ObOOlOO, ObOOOlOOO, ObOOOlOOOO ];
正如十六進制值以前綴OX表示,編譯器會將以O(shè)b開頭的任何值都識別為二進制值,并按照二進制值進行 處理。能夠想到,較大數(shù)的二進制值會非常長,當手動輸入時特別容易犯錯。例如數(shù)字128的二進制值為 10000000——即1后面要跟7個0。對于這種情況,C#7中的新特性數(shù)字分隔符就可以派上用場。例如,下面 的代碼:
int(] numbers = [ 32, 64, 128 ];
int[] numbers = [ ObOOlO一0000, 0b0100_0000f 0bl000_0000 ];
可以看出,將二進制字面值分隔成數(shù)字組有助于増強代碼的可讀性,便于代碼的管理。數(shù)字分隔符不只適 用于二進制值,也可以用于十進制、浮點數(shù)和雙精度數(shù)。下面的代碼在表示Pi的值時,每三位使用了一個分隔 符。使用數(shù)字分隔符的主要目的就是使代碼更易讀。
public const double Pi = 3.141_592_653_589_793_238_462_643_383_279_502;
點擊加載更多評論>>