[.net 面向對象編程基礎] (4) 基礎中的基礎——數據類型轉換


[.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

ToBoolean(Byte, Int32)

char

ToChar(Byte, Int32)

double

ToDouble(Byte, Int32)

short

ToInt16(Byte, Int32)

int

ToInt32(Byte, Int32)

long

ToInt64(Byte, Int32)

float

ToSingle(Byte, Int32)

ushort

ToUInt16(Byte, Int32)

uint

ToUInt32(Byte, Int32)

ulong

ToUInt64(Byte, Int32)

 示例一:

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()可以為多種類型(例出數字類型外boolDateTime等),int.TryParse()int.Parse()只能是整型字符串類型(即各種整型ToString()之后的形式,不能為浮點型,否則int.Parse()就會出現輸入的字符串格式不正確的錯誤,int.TryParse()也會返回false,輸出參數為0),(int)只能是數字類型(例float,int,uint等);

2)對於空值NULL,從運行報錯的角度講,(int)強制轉換和int.Parse()都不能接受NULLConvert.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都返回1Convert.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)時使用。

 

==============================================================================================

返回目錄

 <如果對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>

============================================================================================== 


免責聲明!

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



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