第 8 講:數(shù)據(jù)類型(五):類型轉(zhuǎn)換
Part 1 類型需要轉(zhuǎn)換嗎?
數(shù)據(jù)決定了數(shù)據(jù)處理過程的模式和方法。當(dāng)不同數(shù)據(jù)之間混用的時候,就必須要注意數(shù)據(jù)的轉(zhuǎn)換。舉個例子,int
和 double
是可以互相轉(zhuǎn)換的,因為我們之前介紹字面量的時候,是允許數(shù)據(jù)直接賦值的。但 C# 是嚴(yán)謹(jǐn)?shù)?,這種轉(zhuǎn)換是一種叫做隱式轉(zhuǎn)換(Implicit Cast 或 Implicit Conversion)的機制才成功的;另外,C# 里也提供了一些復(fù)雜類型之間的轉(zhuǎn)化。舉個例子,string
類型的數(shù)據(jù)(字符串)顯然是不可能轉(zhuǎn)換為一個整數(shù)的。因為 string
里可以放任何東西進(jìn)去,所以它里面不一定只有數(shù)字字符。因此,如果一個可能的只有數(shù)字的字符串轉(zhuǎn)換為數(shù)值類型的話,它們之間就需要更為復(fù)雜的轉(zhuǎn)換。
今天我們就需要給大家介紹這類東西。
Part 2 顯式轉(zhuǎn)換(強制轉(zhuǎn)換)
我們允許一種語法形式:(T)變量
,來表示變量強制轉(zhuǎn)換(Explicit Cast 或 Explicit Conversion)為指定的類型。舉個例子:
我們使用這個語法,在數(shù)值左側(cè)寫上 (int)
,表示將 35.5 這個字面量轉(zhuǎn)換為 int
類型的數(shù)據(jù)。如果沒有這個 int
類型的強制轉(zhuǎn)換的話,賦值就會失?。阂驗橛覀?cè)的是小數(shù),左邊是整數(shù),小數(shù)可以表示的數(shù)據(jù)的范圍較大,因此賦值會失敗。
bool b = (bool)3;
以及 int i = (int)false;
類似于這樣的語句一定是失敗的——因為范圍完全沒有交集。
可以使用強制轉(zhuǎn)換的類型有這樣的一些:
float
轉(zhuǎn)所有的整數(shù)數(shù)據(jù)類型;double
轉(zhuǎn)所有的整數(shù)數(shù)據(jù)類型;double
轉(zhuǎn)float
;decimal
轉(zhuǎn)所有的整數(shù)數(shù)據(jù)類型;decimal
轉(zhuǎn)float
和double
;整數(shù)類型轉(zhuǎn)范圍更小的整數(shù)數(shù)據(jù)類型。
但是,如果數(shù)據(jù)超出了可轉(zhuǎn)換的范圍的話,就會在運行期間產(chǎn)生轉(zhuǎn)換數(shù)據(jù)的錯誤。
Part 3 隱式轉(zhuǎn)換
俗話說,只要數(shù)據(jù)類型不同的時候,數(shù)據(jù)賦值就需要類型轉(zhuǎn)換
顯然,3 也可以是一個 double
類型的數(shù)據(jù),即使這里寫出來的 3 這個字面量本身是 int
隱式轉(zhuǎn)換一般適用于所有取值范圍較小轉(zhuǎn)到較大的時候。只要范圍更大的話,必然就可以完全包含全部較小的數(shù)據(jù),那么寫不寫轉(zhuǎn)換的話,C# 肯定都應(yīng)該是允許的:因為 C# 知道,這樣的轉(zhuǎn)換必然是成功的。
當(dāng)然了,你依然可以書寫上強制轉(zhuǎn)換的符號:
只是這個強制轉(zhuǎn)換符號 (double)
完全可以不寫出來。
Part 4 其它轉(zhuǎn)換
顯然,C# 里的字符串是不能給其它類型進(jìn)行轉(zhuǎn)換的。因為字符串本身是用字符拼湊起來的,而字符只是起到顯示的作用:它并非真正的數(shù)值。
那么,我們想把一個只有數(shù)字字符構(gòu)成的字符串,轉(zhuǎn)換為一個數(shù)字的話,這怎么做呢?
4-1 字符串轉(zhuǎn)其它數(shù)據(jù)類型
我隨便寫了這么幾個。可以發(fā)現(xiàn),直接將類型名稱寫出來,在后面追加 .Parse(字符串)
有意思的是,Parse
還能把字符串轉(zhuǎn)成布爾數(shù)據(jù)。比如一個 "false"
字符串,里面是由 f、a、l、s、e 五個字母構(gòu)成的只提供顯示用的字符串。
所有基本數(shù)據(jù)類型都自帶 .Parse
方法。你完全可以把字符串?dāng)?shù)據(jù)(變量、字面量)帶入,然后就可以得到結(jié)果。
4-2 其它數(shù)據(jù)類型轉(zhuǎn)字符串
如果反過來的話,我們使用是 數(shù)值.ToString()
這樣的格式進(jìn)行轉(zhuǎn)換。
.ToString()
,就可以轉(zhuǎn)化為字符串。
4-3 布爾型轉(zhuǎn)整數(shù)
前面介紹了很多數(shù)據(jù)類型,但很遺憾的是,布爾型無法和整數(shù)進(jìn)行轉(zhuǎn)化。學(xué)過 C 語言的朋友都知道,非 0 表示為真、0 表示為假;真表示成 1、假表示為 0。怎么說,布爾和整數(shù)都是可以轉(zhuǎn)換的。
C# 里,布爾型數(shù)據(jù)是無法和整數(shù)進(jìn)行互相轉(zhuǎn)換的。因此,我們必須轉(zhuǎn)換數(shù)據(jù)的話,唯一的辦法是使用這樣復(fù)雜的語句:
和 Convert.ToInt32
方法就專門轉(zhuǎn)化這兩種數(shù)據(jù)類型。但希望你注意,要使用這兩個方法,你需要和 Console.WriteLine
一樣,先寫上 using System;
這條引用指令。
Part 4 綜合示例
我們來看一則完整的 C# 程序:
Console.ReadLine
和 Console.WriteLine
方法的執(zhí)行方向是相反的:Console.ReadLine
是在屏幕上通過用戶輸入,來讀取一個字符串。輸入的內(nèi)容就會自動讀入到左側(cè)變量里。
然后,變量定義是可以不用賦初始數(shù)值的,因為 Console.ReadLine
可以讀取信息給變量,因此沒有必要給變量添加賦值過程。
比如,我輸入的一些數(shù)據(jù)讀入進(jìn)去了之后,結(jié)果可以是這樣的:
Part 5 總結(jié)
那么,至此我們就把數(shù)據(jù)類型的內(nèi)容給大家介紹完畢了。前面我們學(xué)習(xí)了很多數(shù)據(jù)類型的知識點,比如說數(shù)據(jù)類型的意義、數(shù)據(jù)類型的轉(zhuǎn)換、數(shù)據(jù)類型的使用方式等等。我想你對 C# 的數(shù)據(jù)類型有了一個基本的認(rèn)識。沒有關(guān)系,就算你沒有完全記住它們。文檔都是可以提供給你以后查看和參考的,所以不用擔(dān)心忘記了。