C#中的類型轉換


前言

前幾篇文章中經常說到強制類型轉換,就是可以將派生類對象強制轉換為基類對象的做法或者通過as運算符進行的轉換。

今天我們就來一起簡單了解復習下在C#中都有哪些類型的轉換。

要理解轉換很容易,日常的開發編碼過程中,由於變量類型的不同我們可能會根據業務的變更會進行變量值之間的轉換。這里就會出現類型轉換。比如Int型變量轉換為String類型等等。

這里轉換是接受一個類型的值並使用它作為另一個類型的等價值的過程,轉換后的值應和源值一樣。

如下就是典型的強制類型轉換

 short temp = 5;
 sbyte tempTwo = 20;
 tempTwo = (sbyte)temp;

類型轉換

在進行數據轉換的過程中,很多時候會存在數據精度丟失的問題,比如在和下位機進行通信的過程中,可能兩者通過固定協議來傳輸和解析字段,這時候對於數據精度的關注就特別重要,不可出現轉換不對的問題。

比如協議里面某字段要求是8字節的double類型,你在轉換的過程中不能轉換為4字節的float。

但是在進行轉換的過程中有些類型就不會丟失數據和精度,比如將8位的值轉換為16位值數據。這就是所謂的隱式轉換。語言在使用過程中,編譯器會自動進行轉換。

當從位數更少的源轉換為位數更多的目標類型時,目標中多出來的位需要用0或1填充;當從更小的無符號類型轉換為更大的無符號類型時,目標類型多出來的最高位都以0進行填充,也就是所謂的零擴展。對於有符號的類型的轉換而言,額外的高位用源表達式的符號位進行填充。

這里既然有隱式轉換和強制類型轉換,那么也就會有顯示轉換。比如我們想將短類型轉換為長類型,在長類型里面很容易放下短類型的值,但是如果反過來,這里就會出現問題。在短類型中,無法放下所有長類型的內容,就會出現數據或精度的丟失。

下面是C#中各個類型的字節長度

1)   bool, System.Boolean 類型,它用於聲明變量來存儲布爾值 true 和 false。
2)   sbyte, System.SByte 類型,最小值為-128,最大值為127,可顯示轉換為 int、long、double、float、decimal 類型。
3)   byte, System.Byte 類型,最小值為0,最大值為255,可顯示轉換為 int、long、double、float、decimal 類型。
4)   short, System.Int16 類型,最小值為-32768,最大值為32767,可顯示轉換為 int、long、double、float、decimal 類型。
5)   ushort, System.UInt16 類型,最小值為0,最大值為65535,可顯示轉換為 int、long、double、decimal、float 類型。
6)   int, System.Int32 類型,最小值為-2147483648,最大值為2147483647;可顯示轉換為 long、double、decimal、float 類型。
7)   uint, System.UInt32 類型,最小值為0,最大值為4294967295,聲明 uint 類型變量使用后綴 u或U,可顯示轉換為 long、double、decimal、float 類型。
8)   long, System.Int64 類型,最小值為-9223372036854775808,最大值為9223372036854775807L,聲明 long 類型變量使用后綴 l或L,可顯示轉換為 double、decimal、float 類型。
9)   ulong, System.UInt64 類型的最小值為0,最大值為18446744073709551615,聲明 long 類型變量使用后綴 ul或UL,可顯示轉轉為 double、decimal、float 類型。
10)  float, System.Singe 類型,最小值為-3.4 × 1038,最大值為+3.4 × 1038,表示存儲32位浮點值的簡單類型,聲明 float 類型變量使用后綴 f或F,可顯示轉換為 double 類型,轉為 int、long、decimal 類型,需隱式轉換。
11)  double, System.Double 類型,最小值為±5.0 × 10−324,最大值為±1.7 × 10308,表示存儲64位浮點值的簡單類型,聲明 double 類型變量使用后綴 d或D;換為 int、long、float、decimal 類型,需隱式轉換。
12)  decimal, System.Decimal 類型的大致范圍(-7.9 x 1028 - 7.9 x 1028) / (100 - 28),表示128位數據類型,同浮點型相比,decimal 類型具有更高的精度和更小的范圍,這使它適合於財務和貨幣計算,聲明 decimal 類型變量使用后綴 m或M,轉為 int、long、double、float 類型,需隱式轉換。
13)  char, System.Char 類型范圍(U+0000 到 U+FFFF),用於聲明 .NET framework 使用Unicode字符表示 System.Char 結構的實例;可顯示轉換為 short、int、long、float、double、decimal 類型。轉為 string 類型,需使用 ToString() 方法。
14)  enum, System.Enum 類型,一種由一組稱為枚舉數列表的命名常量組成的獨特類型。
15)  struct 類型,通常用來封裝小型相關變量組,例如:矩形的坐標或庫存商品的特征。

在C#中會經常使用Convert類下的方法進行類型之間的轉換工作。

 int ahui=27;
 string age = Convert.ToString(ahui);
 double ageTwo = Convert.ToDouble(ahui);
 Single ageThree=Convert.ToSingle(ahui);

隱式引用轉換

  • 所有引用類型可以被隱式轉換為object類型
  • 任何類型可以隱式轉換到它繼承的接口
  • 類可以隱式轉換到繼承鏈的任何類或它實現的任何接口

顯示引用轉換

  • 從object到任何引用類型的轉換
  • 從基類到從它繼承的類的轉換

裝箱和拆箱

裝箱:指在C#的轉換過程中值類型到引用類型的轉換過程稱為裝箱。

拆箱:指將裝箱后的對象(引用類型)轉換到值類型的過程。

裝箱是一種隱式轉換,它接受值類型的值,根據這個值在堆上創建一個完整的引用類型對象並返回對象引用。

//int 為值類型;  string為引用類型 
int ahui;
string age;

ahui=27;                           
//裝箱操作
age = Convert.ToString(ahui);      
//拆箱操作
ahui = Convert.ToInt32(age);             

寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看得見的。

原創不易,給個關注。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM