C#型別轉換
阿新 • • 發佈:2020-08-26
C#型別轉換的可能情況
-
值型別間的傳統強制型別轉換,(type)變數名
-
使用as的安全型別轉換
-
派生類轉基類,隱式轉換;基類轉派生類,顯式轉換
-
值型別轉引用型別,稱為裝箱;引用型別轉值型別,稱為拆箱
-
從低精度的數值型別到高精度的數值型別的轉換,隱式數值轉換
-
基本型別之間,使用Convert類實現型別轉換
-
字串型別轉換成任意型別,使用Parse方法
(type)變數名
傳統不安全的強制型別轉換
Object obj1 = new NewType(); //第一種:不安全 NewType newValue = (NewType)obj1; Object obj1 = new NewType(); //第二種:不高效 NewType newValue = null; try { newValue = (NewType)obj1; } catch (Exception err) { MessageBox.Show(err.Message); }
as+型別
安全高效的型別轉換
Object obj1 = new NewType();
NewType newValue = obj1 as NewType;
當需要轉化物件的型別屬於轉換目標型別,或者轉換目標型別的派生型別時,才能成功,當不成功的時候,會返回null,所以使用前需判是否為null檢查轉換成功與否,直接使用將丟擲異常
- 無法應用於值型別轉換(因為值型別不能為null)
- 無法應用於自定義型別間轉換
Is+型別
檢查物件是否與給定的型別相容
Object obj1 = 10;
if(obj1 is int )
{
int num = (int)obj1;
}
若物件引用是null,is運算子總是返回false,因為沒有可檢查其型別的物件。
- Object => 已知引用型別——使用as操作符完成
- Object => 已知值型別——先使用is操作符來進行判斷,再用型別強轉換方式進行轉換
裝箱與拆箱
裝箱步驟
- 在託管堆中分配記憶體,除了分配值型別各個欄位所需記憶體,還要加上託管堆所有物件都有的兩個額外成員(型別物件指標和同步索引塊)所需的記憶體
- 將值型別的欄位複製到新分配的堆記憶體中
- 返回物件地址,即物件的引用
拆箱步驟
- 獲取物件各個欄位的地址
- 將各個欄位的值從託管堆上覆制到執行緒棧新的值型別例項
Convert
一般格式
convert.To資料型別(變數名);
常用的convert型別轉換方法
方法 | 解釋 |
---|---|
Convert.ToInt16() | 轉換為整型(short) |
Convert.ToInt32() | 轉換為整型(int) |
Convert.ToInt64() | 轉換為整型(long) |
Convert.ToChar() | 轉換為字元型(char) |
Convert.ToString() | 轉換為字串型(string) |
Convert.ToDateTime() | 轉換為日期型(datetime) |
Convert.ToDouble() | 轉換為雙精度浮點型(double) |
Conert.ToSingle() | 轉換為單精度浮點型(float) |
字串與其他型別的轉換
其他型別轉為字串,使用
變數名.ToString();
字串轉換為其他型別
資料型別.Parse(字串型別的值);
note:
當多於一個字元的字串用Parse轉換為char型別時,會丟擲異常
當不是數字的字串用Parse轉換為int型別時,會丟擲異常
示範
//ToString
int i = 10;
string str = i.ToString();
Console.Write(str);
//輸出:10
//Parse
char i = char.Parse("h");
Console.Write(i);
//輸出:h
int i = int.Parse("21");
Console.Write(i);
//輸出:21