瞭解了資料類型與變數的基本概念之後,我們來討論資料類型的轉換與裝箱與拆箱!
一 資料類型轉換
在編程時 我們有時候會遇到將一個類型的變數轉換成另一種資料類型,我們稱它為資料類型的轉換,C#資料類型的轉換有兩種方式如下:
1.預設安全的資料類型轉換
預設安全的資料類型轉換:我們稱之為 隱式的資料類型轉換,什麼是隱式的資料類型轉換?隱式的資料類型轉換就是資料類型的低範圍(參考C#資料類型與變數一中的資料類型的範圍)向高範圍的資料類型的轉換。例如:
1 int a = 200; //int 範圍是 -2147483648~2147483647
2 long b = a; //long 範圍是 -9223372036854775808~9223372036854775807 表示的整數範圍更大 並且這個範圍包含200
3 //所以我們認為這兩個資料類型轉換是預設合法的也稱隱式資料類型轉換
4 Console.WriteLine("b = "+b.ToString());
運行結果當時會輸出:“b = 200”這段話啦。。
2.強制的資料類型轉換
瞭解隱式資料類型的轉換後,我們在來瞭解下強制的類型轉換,強制類型轉換就是,當不滿足隱式資料類型轉換的規則時,的一種資料類型轉換的方法,強制資料類型轉換必然會引發一些錯誤,例如:
將高範圍資料類型(簡稱高)轉換低範圍資料類型(簡稱低)時,那麼當“高”變數的值,超出了“低”資料類型的範圍時,我們簡稱資料類型溢出。代碼如下:
1 long a = 3333333333; //long 範圍是 -9223372036854775808~9223372036854775807 ->3333333333在這個範圍中合法
2 int b = (int)a; //int 範圍是 -2147483648~2147483647 -> 3333333333 超出了這個範圍 所以導致資料類型溢出
3 Console.WriteLine("a =" + a.ToString());
4 Console.WriteLine("b ="+b.ToString());//類型溢出這裡會輸出一個非常大的負數
輸出結果如下:
二 裝箱與拆箱
理解完基礎資料型別 (Elementary Data Type)的轉換後我們來看一下實值型別與參考型別之間的轉換,我們稱為裝箱與拆箱。
1.裝箱
裝箱就將實值型別轉換成參考型別:
int a = 10;
object obj = a; //將實值型別轉換參考型別,裝箱操作
在裝箱操作時,運行時會在託管堆上分配一個空間,存放a 中的10,並標誌這塊空間的裝箱類型是int。
2.拆箱
那拆箱就跟裝箱相反,就是將參考型別還原會實值型別。
int a = 10;
object obj = a; //將實值型別轉換參考型別 裝箱
int b = (int)obj; //將參考型別轉換為實值型別 拆箱
當拆箱時我們會將推中的10強制類型轉換放到棧空間中(圖中代表int b)。
3.裝箱與拆箱的作用
當我需要顯示的方法,分別來顯示 int float double類型的值到控制台。一般我們的設計方法如下:
class MyProgram
{
//用來列印int類型的值
public static void ShowInt(int a)
{
Console.WriteLine(" a ="+a.ToString());
}
//用來列印float類型的值
public static void ShowFloat(float a)
{
Console.WriteLine(" a ="+a.ToString());
}
//用來列印double類型的值
public static void ShowDouble(double a)
{
Console.WriteLine(" a ="+a.ToString());
}
static void Main(string[] args)
{
int a = 10;
ShowInt(a);
float b = 2.2;
ShowFloat(b);
double c = 2.22;
ShowDouble(c);
}
}
那麼我們思考一下,這個時候我需要在支援 string , short,char等等的類型顯示的時候,我們是不是需要對每一個類型都定義一個顯示的方法? 此時我們在看看引入了裝箱與拆箱概念的方法設計:
class MyProgram
{
//將參數類型改為object
public static void ShowObject(object obj)
{
Console.WriteLine("obj ="+obj.ToString());
}
static void Main(string[] args)
{
int a = 10;
ShowObject(a); //int a 被裝箱
float b = 2.2;//float b 被裝箱
ShowObject(b);
double c = 2.22;//double c 被裝箱
ShowObject(c);
}
}
這樣我們將來不管需要擴充多少資料類型我們這個方法都可以滿足。
OK 資料類型與變數部分結束。下一篇介紹一下 C#的運算子。