C#8.0本質(zhì)論第二章–數(shù)據(jù)類型
2.1基本數(shù)據(jù)類型
C#的基本數(shù)據(jù)類型都有關(guān)鍵字與之關(guān)聯(lián),decimal是特殊的浮點(diǎn)數(shù)類型,能存儲大數(shù)字而無表示錯(cuò)誤。
2.1.1整數(shù)類型
C#中有8種整數(shù)類型
類型 | 大小 | BCL名稱 | 后綴 |
---|---|---|---|
sbyte | 8位 | System.SByte | |
byte | 8位 | System.Byte | |
short | 16位 | System.Int16 | |
ushort | 16位 | System.UInt16 | |
int | 32位 | System.Int32 | |
uint | 32位 | System.UInt32 | U或u |
long | 64位 | System.Int64 | L或l |
ulong | 64位 | System.UInt64 | UL或ul |
C#所有基元類型都有短名稱和完整名稱,完整名稱對應(yīng)**BCL(基類庫)**中的類型名稱,該名稱在所有語言中都相同,對程序集中的類型進(jìn)行了唯一性標(biāo)識。從編譯器角度看,最終生成的CIL代碼看不出源代碼具體使用的是哪一種。不要時(shí)而用短名稱時(shí)而用完整名稱,比如用string而不是System.String。
2.1.2浮點(diǎn)類型
浮點(diǎn)數(shù)精度可變,除非分母恰好是2的整數(shù)冪,否則用二進(jìn)制浮點(diǎn)類型無法準(zhǔn)確表示該數(shù)比如0.1容易表示成0.09999999…或者0.10000…1,
類型 | 大小 | BCL名稱 | 有效位數(shù) | 后綴 |
---|---|---|---|---|
float | 32位 | System.Single | 7 | F或f |
double | 64位 | System.Double | 15-16 | D或d |
2.1.3decimal類型
類型 | 大小 | BCL名稱 | 有效位數(shù) | 后綴 |
---|---|---|---|---|
decimal | 128位 | System.Decimal | 28-29 | M或m |
和浮點(diǎn)數(shù)不同,decimal類型保證范圍內(nèi)的所有十進(jìn)制數(shù)都是精確的,但是它的范圍較小,計(jì)算速度稍慢,但差別不大可以忽略不計(jì)。之所以用m表示decimal是因?yàn)檫@種數(shù)據(jù)類型經(jīng)常用于貨幣(monetary)計(jì)算。
2.1.4字面值
字面值(literal value)表示源代碼中的固定值。直接將值放到源代碼中稱為硬編碼(hardcoding)。默認(rèn)情況下輸入帶小數(shù)點(diǎn)的字面值,編譯器會自動把它解釋成double類型,整數(shù)值通常默認(rèn)為32位int,如果值太大編譯器會把它解釋成long。此外,C#編譯器允許向非int的數(shù)值類賦值,如:
short s = 42;
byte b = 77;
這一點(diǎn)僅對字面值成立,而下面是非法的:
b = s;
有時(shí)數(shù)字很大,為了解決可讀性問題,C#7.0新增了對數(shù)字分隔符的支持,可在書寫字面值時(shí)用下劃線(_)分割,如9_814_072_356
0x002A表示16進(jìn)制42,從C#7.0開始可將數(shù)字表示成二進(jìn)制值,如0b101010表示42,從C#7.2開始可以把數(shù)字分隔符放到x或b后面
輸出時(shí)可以將數(shù)字格式化成十六進(jìn)制:
//輸出0x2A,即十六進(jìn)制的42
System.Console.Writeline($"0x{42:X}");
為了更準(zhǔn)確地表示double值的字符串形式,可以使用格式字符串和**round-trip格式說明符R(或r)**進(jìn)行轉(zhuǎn)換。
2.2更多基本類型
2.2.1布爾類型
類型 | 大小 | BCL名稱 |
---|---|---|
bool | 8位 | System.Boolean |
雖然一個(gè)二進(jìn)制位足以容納布爾一個(gè)類型的值,但是在C#里bool實(shí)際是一個(gè)字節(jié)大小。
2.2.2字符類型
類型 | 大小 | BCL名稱 |
---|---|---|
char | 16位 | System.Char |
char表示16位字符,雖然大小和ushort相同,但是char是C#特有類型,要單獨(dú)對待(C++里是8位)。
反斜杠和特殊字符代碼統(tǒng)稱為轉(zhuǎn)義序列(escape sequence)。
2.2.3字符串
類型 | BCL名稱 |
---|---|
string | System.String |
零或多個(gè)字符的有限序列稱為字符串。
C#允許在字符串前使用@符號,指明轉(zhuǎn)義序列不被處理,結(jié)果是一個(gè)逐字字符串字面值(verbatim string literal)。(對應(yīng)C++11里的raw string)。
和C++不同的是,C#不自動連接字符串字面值。(是的,C++里"ab" “cd"會自動連接成"abcd”)。
假如同一字符串面值在程序集中多次出現(xiàn),那么編譯器在程序集中只定義字符串一次,且所有變量都指向它。
逐字和插值可組合使用,先指定$再指定@。
字符串插值是調(diào)用string.Format()方法的語法糖,比如:
//表面上
System.Console.Writeline($"your name is {firstname},{lastname}.");
//實(shí)際上
object[] args = new object[] {firstname,lastname};
System.Writeline($"your name is {0},{1}.",args);
實(shí)現(xiàn)了某種程度上的本地化支持,不會因?yàn)樽址斐删幾g后代碼注入。
一些字符串方法:Format,Concat,Compare,StartsWith,EndsWith,ToLower,ToUpper,Trim,TrimEnd,Replace.
之前調(diào)用靜態(tài)方法需附加如命名空間和類型名前綴,可利用C#6.0新增的using static指令避免這些前綴。只支持靜態(tài)方法和屬性。
如果要在插值或格式化的字符串中添加實(shí)際的左右大括號,可連寫兩個(gè)大括號來表示,如$“{{ {123} }}“表示字符串”{ 123 }”.
輸出換行所需的字符由操作系統(tǒng)決定,Windows的換行符是\r和\n兩個(gè)字符組合,而UNIX是單個(gè)\n,
要依賴System.WriteLine()和System.Enviroment.NewLine()而不是\n來確保跨平臺兼容。
C#語法允許像訪問成員變(在C#中稱為字段)量那樣訪問屬性(Property),屬性定義了稱為**賦值方法(setter)和取值方法(getter)**的特殊方法
string類型的關(guān)鍵特征是它不可變(immutable),處于性能考慮,沒有提供修改現(xiàn)有字符串內(nèi)容的機(jī)制,不可能在同一個(gè)內(nèi)存位置將字符串中的字母全部轉(zhuǎn)換成大寫,只能在其他位置新建字符串,讓它成為舊字符串大寫字母版本,而舊字符串不會被修改。
如有大量字符串需要修改,可考慮使用System.Text.StringBuilder類型而不是string。
2.2.4null和void
將null賦給引用類型的變量和根本不賦值是不一樣的概念。將null賦給string變量和為變量賦值""也不是一樣的概念。
聲明變量時(shí)在名稱后加一個(gè)問號,表示該變量可以被設(shè)置為null,這便是可空修飾符(C#2.0后)。
在C#8.0之前,可控修飾符不能用于引用類型變量的聲明,從C#8.0開始,有了可空引用類型的概念,若要啟動,則需要在聲明變量之前任意位置放置"#nullable enable"語句。被啟用時(shí)將沒有可控修飾符的變量設(shè)置為null將會產(chǎn)生警告信息。
void有兩個(gè)含義:標(biāo)記方法不返回任何值,以及代表指向未知類型的存儲位置的一個(gè)指針,但這種在C#中比較罕見。
2.3數(shù)據(jù)類型轉(zhuǎn)換
有可能造成數(shù)據(jù)丟失或拋出異常的任何轉(zhuǎn)換都要執(zhí)行顯示轉(zhuǎn)型。相反的都可以進(jìn)行隱式轉(zhuǎn)型。
2.3.1顯示轉(zhuǎn)型
默認(rèn)情況下,容不下的數(shù)據(jù)在賦值時(shí)會悄悄地溢出,但將代碼放到checked塊中,就會使運(yùn)行時(shí)引發(fā)System.OverflowException異常:
checked
{
int n = inr.MaxValue+1;
}
還支持unchecked塊強(qiáng)制不進(jìn)行溢出檢查。
C#不支持從數(shù)值類型到布爾類型的有效轉(zhuǎn)換,是為了避免可能發(fā)生的歧義,還有助于避免用戶在本應(yīng)使用相等操作符的時(shí)候用賦值操作符。
2.3.2隱式轉(zhuǎn)型
2.3.3不使用轉(zhuǎn)型操作符的類型轉(zhuǎn)換
每個(gè)數(shù)值數(shù)據(jù)類型都包含一個(gè)Parse()方法,允許將字符串轉(zhuǎn)換成對應(yīng)的數(shù)值類型,還可以用特殊類型System.Convert()。
所有類型都支持ToString()方法。
從C#2.0起,所有基元數(shù)值類型都包含靜態(tài)TryParse()方法,與Parse()的區(qū)別是,轉(zhuǎn)換失敗不是拋出異常,而是返回false。文章來源:http://www.zghlxwxcb.cn/news/detail-634074.html
從C#7.0開始不用先聲明只準(zhǔn)備作為out參數(shù)使用的變量,該變量在if內(nèi)部和外部均可使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-634074.html
到了這里,關(guān)于C#8.0本質(zhì)論第二章--數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!