1. 程式人生 > 實用技巧 >C#型別轉換

C#型別轉換

C#型別轉換的可能情況

  1. 值型別間的傳統強制型別轉換,(type)變數名

  2. 使用as的安全型別轉換

  3. 派生類轉基類,隱式轉換;基類轉派生類,顯式轉換

  4. 值型別轉引用型別,稱為裝箱;引用型別轉值型別,稱為拆箱

  5. 從低精度的數值型別到高精度的數值型別的轉換,隱式數值轉換

  6. 基本型別之間,使用Convert類實現型別轉換

  7. 字串型別轉換成任意型別,使用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操作符來進行判斷,再用型別強轉換方式進行轉換

裝箱與拆箱

裝箱步驟

  1. 在託管堆中分配記憶體,除了分配值型別各個欄位所需記憶體,還要加上託管堆所有物件都有的兩個額外成員(型別物件指標和同步索引塊)所需的記憶體
  2. 將值型別的欄位複製到新分配的堆記憶體中
  3. 返回物件地址,即物件的引用

拆箱步驟

  1. 獲取物件各個欄位的地址
  2. 將各個欄位的值從託管堆上覆制到執行緒棧新的值型別例項

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