[.net物件導向編程基礎] (4)基礎中的基礎——資料型別轉換
1.為什麼要進行資料轉換?
首先,為什麼要進行資料轉換,拿值型別例子說明一下,
比如:我們要把23角零錢,換成2.30元,就需要把整形轉換成小數型。
再比如我們轉換一個引用型別的資料,前面說過我們自定義類屬於引用型別,假如我們定義了兩個類,一個類叫“白貓”,一個類叫“黑貓”,我們要讓他們都歸為“貓”這個類(不管黑貓白貓,能捉老鼠就是好貓),這種情況就需要將白貓和黑貓這兩個類轉換成“貓”類。
因此為了運算方便,我們經常要進行不同資料型別間的轉換。而且計算機在儲存資料的時候,因為資料長度等不同,佔用的儲存空間要根據預定義好的型別事先分配。在存取之前要進行資料型別的轉換。
2.C#型別轉換的方式:隱式轉換、顯式轉換、使用者自定義轉換、使用幫助程式類的轉換
隱式轉換:由於該轉換是一種安全型別的轉換,不會導致資料丟失,因此不需要任何特殊的語法。 例如,從較小整數型別到較大整數型別的轉換以及從派生類到基類的轉換都是這樣的轉換。
顯式轉換(強制轉換):顯式轉換需要強制轉換運算子。 在轉換中可能丟失資訊時或在出於其他原因轉換可能不成功時,必須進行強制轉換。典型的例子包括從數值到精度較低或範圍較小的型別的轉換和從基類例項到派生類的轉換。
使用者定義的轉換:可以定義一些特殊的方法來執行使用者定義的轉換,從而使不具有基類–派生類關係的自定義型別之間可以顯式和隱式轉換。
使用幫助程式類的轉換:若要在不相容的型別之間進行轉換,例如在整數與 DateTime 物件之間轉換,或者在十六進位制字串與位元組陣列之間轉換,則可以使用 BitConverter 類、Convert 類和內建數值型別的 Parse 方法,例如 Int32.Parse。
3.型別轉換方式選擇
C#已經為我們提供了一個很好的型別轉換方式,那麼在進行型別轉換的時候,可以按照如下的方式進行選擇。
型別轉換 |
使用選擇 |
Object => 已知引用型別 |
使用as操作符來完成 |
Object => 已知值型別 |
先使用is操作符來進行判斷,再用型別強轉方式進行轉換 |
已知引用型別之間轉換 |
首先需要相應型別提供轉換函式,再用型別強轉方式進行轉換 |
已知值型別之間轉換 |
最好使用系統提供的Convert類所涉及的靜態方法 |
4.操作符is 和 as
通過上表,我們知道:
A.is是對型別的判斷,返回值為bool型別;
B.as不校驗,直接轉換
C.as進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別,檢查物件型別的相容性,並返回轉換結果,如果不相容則返回null;
D.他們都在引用型別顯式轉換(as)或型別判斷(is)時使用。
5.裝箱和拆箱轉換(Boxing,UnBoxing)
主要是值型別與引用型別之間相互轉換
如:object obj 1= 10;
int i = (int)obj; //拆箱
int j = 100;
object obj2 = j; //裝箱
6.已知值型別轉換類
表3中介紹了幾種轉換方式的選擇,對於已知值型別,我們推薦使用系統類提供靜態方式進行轉換。
下面有必要對常用類進行說明
列舉轉換
列舉型別與其他任何型別之間不存在隱式轉換。而和列舉型別相關的顯式轉換包括:
a.從所有整數型別(包括字元型別)和實數型別到列舉型別的顯式轉換;
b.從列舉型別到所有整數型別(包括字元型別)和實數型別的顯式轉換;
c.從列舉型別到列舉型別的顯式轉換。
內建數值型別的 Parse 和TryParse
示例:
bool result = Int32.TryParse(value, out number);
它們兩個區別在於TryParse不會引發異常
Convert 類
將一個基本資料型別轉換為另一個基本資料型別。
Convert方法比較多,下面列舉幾個常用的
示例:int iNumber = System.Convert.ToInt32(dNumber);
更多方法,詳細請查詢MSDN BitConverter 類
BitConverter 類
將基礎資料型別與位元組陣列相互轉換。
方法較多,詳細請查詢MSDN BitConverter 類
將位元組陣列轉換為 int
返回型別 |
方法 |
bool |
|
char |
|
double |
|
short |
|
int |
|
long |
|
float |
|
ushort |
|
uint |
|
ulong |
示例一:
byte[] bytes = { 0, 0, 0, 25 };
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);// Output: int: 419430400
示例二:byte[] bytes = BitConverter.GetBytes(201805978);
Console.WriteLine("byte array: " + BitConverter.ToString(bytes));
// Output: byte array: 9A-50-07-0C
日期類轉換
字串轉日期
string dateString = "5/1/2008 8:30:52 AM";
DateTime date1=DateTime.Parse(dateString,System.Globalization.CultureInfo.InvariantCulture);
日期轉字串
DateTime dat1 = new DateTime();string datastr=
dat1.ToString(System.Globalization.CultureInfo.InvariantCulture);
要點:
1. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的區別
1)對於轉換物件,Convert.ToInt32()可以為多種型別(例出數字型別外bool,DateTime等),int.TryParse()和int.Parse()只能是整型字串型別(即各種整型ToString()之後的形式,不能為浮點型,否則int.Parse()就會出現輸入的字串格式不正確的錯誤,int.TryParse()也會返回false,輸出引數為0),(int)只能是數字型別(例float,int,uint等);
2)對於空值NULL,從執行報錯的角度講,(int)強制轉換和int.Parse()都不能接受NULL;Convert.ToInt32()其實是在轉換前先做了一個判斷,引數如果為NULL,則直接返回0,否則就呼叫int.Parse()進行轉換,int.TryParse()其實是對int.Parse()做了一個異常處理,如果出現異常則返回false,並且將輸出引數返回0;
3)針對於浮點型的取捨問題,浮點型只有Convert.ToInt32()和(int)能進行轉換,但是也是進行取捨了的,Convert.ToInt32()採取的取捨是進行四捨五入,而(int)則是擷取浮點型的整數部分,忽略小數部分,例如Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而(int)1.5d還是返回1;
4)關於溢位,將大的資料型別轉換為小的資料型別時Convert.ToInt32()和int.Parse()都會報溢位錯誤,值對於Int32太大或太小,而(int)不報錯,但是返回值為-1。
如此可見,我們在進行資料轉換前選擇轉換方法要謹慎,如果是數字型別可以考慮直接用(int)強制轉換,如果是整型字串型別的,考慮用int.Parse()進行轉換,如果不是這兩種型別,再考慮用Convert.ToInt32()進行轉換。
2.型別轉換操作符is 和 as 區別
A.is是對型別的判斷,返回值為bool型別;
B.as不校驗,直接轉換
C.as進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別,檢查物件型別的相容性,並返回轉換結果,如果不相容則返回null;
D.他們都在引用型別顯式轉換(as)或型別判斷(is)時使用。
==============================================================================================
返回目錄
<如果對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>
==============================================================================================