在上一篇文章中,學(xué)習(xí)記錄了 C# 語(yǔ)言中常量和各類(lèi)運(yùn)算符的內(nèi)容。在涉及運(yùn)算符的時(shí)候,還提到了相關(guān)數(shù)據(jù)類(lèi)型轉(zhuǎn)換,今天這篇文章來(lái)詳細(xì)學(xué)習(xí)一下關(guān)于 C# 語(yǔ)言中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。
一、類(lèi)型轉(zhuǎn)換
在第二天的學(xué)習(xí)中,已經(jīng)學(xué)習(xí)了C# 語(yǔ)言中的基礎(chǔ)數(shù)據(jù)類(lèi)型,如整數(shù)類(lèi)型 int
、浮點(diǎn)數(shù)類(lèi)型 float
、布爾類(lèi)型 bool
以及字符類(lèi)型 char
等等。這時(shí)候有一些疑問(wèn)了。如果整數(shù)和浮點(diǎn)數(shù)相加,那么結(jié)果返回的是整數(shù)還是浮點(diǎn)數(shù)類(lèi)型?數(shù)字類(lèi)型的值可以和字符類(lèi)型進(jìn)行算術(shù)操作嗎?布爾值和其他類(lèi)型操作的結(jié)果是什么?
解答這些疑問(wèn),就需要對(duì)數(shù)據(jù)類(lèi)型轉(zhuǎn)換有所了解。
1、轉(zhuǎn)換形式
在 C# 數(shù)據(jù)類(lèi)型的形式也是分為兩種:
(1)隱式類(lèi)型轉(zhuǎn)換 - 這是一個(gè) C# 默認(rèn)的以安全的形式進(jìn)行的轉(zhuǎn)換。例如:從小的數(shù)類(lèi)型到大的整數(shù)類(lèi)型,從派生類(lèi)到基類(lèi)。
int i = 3;
long l = i; // l = 3
(2)顯示類(lèi)型轉(zhuǎn)換 - 就是強(qiáng)制類(lèi)型轉(zhuǎn)換,需要強(qiáng)制轉(zhuǎn)換運(yùn)算符。使用顯式轉(zhuǎn)換,可能會(huì)造成數(shù)據(jù)缺失。
int i = 1000000;
short s = (short)i; // s = 16960
2、不同類(lèi)型的轉(zhuǎn)換
接下來(lái)就看一看不同的數(shù)據(jù)類(lèi)型之間哪些需要顯示轉(zhuǎn)換,而哪些又屬于是隱式轉(zhuǎn)換。
(1)浮點(diǎn)數(shù)和整數(shù)類(lèi)型
int a = 3;
float b = 2.3f;
int c = a + (int)b; // c = 5
float d = a + b; // d = 5.3
整數(shù)類(lèi)型可以被默認(rèn)隱式轉(zhuǎn)換為浮點(diǎn)數(shù),而浮點(diǎn)數(shù)如果想要轉(zhuǎn)換為整數(shù),則需要使用整數(shù)類(lèi)型的強(qiáng)轉(zhuǎn)運(yùn)算符。
浮點(diǎn)數(shù)強(qiáng)轉(zhuǎn)為整數(shù)類(lèi)型之后,只保留了整數(shù)部分,小數(shù)部分的數(shù)值丟失。
(2)字符和整數(shù)類(lèi)型
char a = 'A';
int x = c; // x = 65
int b = 49;
char y = (char)b; // y = '1'
字符類(lèi)型的值可以被隱式轉(zhuǎn)換為整數(shù)類(lèi)型,而整數(shù)類(lèi)型想要轉(zhuǎn)換為字符類(lèi)型,則需要 char 強(qiáng)轉(zhuǎn)。
字符之所以能和整數(shù)類(lèi)型進(jìn)行轉(zhuǎn)換,這是因?yàn)?ASCII 或者 Unicode 等編碼表,每個(gè)字符對(duì)應(yīng)的就是一個(gè)數(shù)字。然而這些數(shù)字對(duì)于計(jì)算機(jī)而言,就是一串的二進(jìn)制。雖然在我們看來(lái)是數(shù)字和文字,區(qū)別很大,但對(duì)于計(jì)算機(jī)而言它們都只是二進(jìn)制的數(shù)字而已。
(3)布爾類(lèi)型
bool n;
int a = 1;
n = (bool)a; // 錯(cuò)誤
float b = 2.3f;
n = (bool)b; // 錯(cuò)誤
char c = '0';
n = (bool)c; // 錯(cuò)誤
布爾類(lèi)型不能夠直接和其他類(lèi)型隱式轉(zhuǎn)換,也不能直接使用類(lèi)型強(qiáng)轉(zhuǎn)運(yùn)算符來(lái)進(jìn)行強(qiáng)制轉(zhuǎn)換。
想要轉(zhuǎn)換為布爾類(lèi)型,就需要引入 C# 內(nèi)置的一些數(shù)據(jù)類(lèi)型轉(zhuǎn)換方法。
3、類(lèi)型轉(zhuǎn)換方法
(1) Convert.ToBoolean(param)
bool b;
string str = 'false';
b = Convert.ToBoolean(str); // b = False
int num = 1;
b = Convert.ToBoolean(num); // b = True
float ff = 3.24f;
b = Convert.ToBoolean(ff); // b = True
(2) Convert.ToInt32(param)
int i;
char word = '1';
i = Convert.ToInt32(word); // i = 49
string num = "321";
i = Convert.ToInt32(num); // i = 321
bool boo = true;
i = Convert.ToInt32(num); // i = 1
轉(zhuǎn)換整數(shù)類(lèi)型的方法有 ToInt16
相當(dāng)于 short
類(lèi)型;ToInt32
相當(dāng)于 Int
類(lèi)型,也是程序中最常使用的;ToInt64
相當(dāng)于 Long
類(lèi)型。
這個(gè)方法通常是應(yīng)用在,當(dāng)接收用戶輸入數(shù)值的時(shí)候,轉(zhuǎn)換為整數(shù)類(lèi)型。
(3) ToString()
string str;
int num = 3234;
str = num.ToString(); // str = "3234"
bool boo = false;
str = boo.ToString(); // str = "false"
float foo = 32.43f;
str = foo.ToString(); // str = "32.43"
Convert.ToString(param)
和 ToString()
兩個(gè)方法的作用是差不多的,后者是屬于 Object
的擴(kuò)展方法,因此所有類(lèi)型都會(huì)有 ToString()
這個(gè)方法。前者里面的參數(shù),可以使各種類(lèi)型的基礎(chǔ)數(shù)據(jù)類(lèi)型,或者 Object
類(lèi)對(duì)象。
一般情況,上面這兩個(gè)方法都是可以通用的。但是當(dāng)返回的數(shù)據(jù)類(lèi)型中可能出現(xiàn) null 值的情況,調(diào)用了 ToString
方法,就會(huì)返回 NullReferenceException
。而 Convert.ToString
不會(huì)拋出異常,而是返回一個(gè)空字符串。
(4) 其他轉(zhuǎn)換方法
Convert.ToUint32
- 轉(zhuǎn)換為無(wú)符號(hào)的整數(shù)類(lèi)型。和 Convert.ToInt32
很相似,一樣都有16位和64位。
Convert.ToDecimal
- 將浮點(diǎn)數(shù)或者整數(shù)轉(zhuǎn)換為 Decimal
十進(jìn)制類(lèi)型。
Convert.Double
- 轉(zhuǎn)為 Double
雙精度浮點(diǎn)數(shù)類(lèi)型。
...
二、總結(jié)
關(guān)于 C# 一些簡(jiǎn)單的數(shù)據(jù)類(lèi)型轉(zhuǎn)換的內(nèi)容就記錄到這了。
至于其他更深層次的內(nèi)容,就留到后面學(xué)習(xí)到了,再接著進(jìn)行延伸擴(kuò)展。