天天看點

[畢業生的商業軟體開發之路]C#資料類型轉換

近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟體開發行業帶來一些幫助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。[袁永福版權所有]

--------------------------------------------------------------------

在程式開發中經常需要進行資料類型的轉換,C#提供強制資料類型轉換和使用關鍵字as的資料類型轉換,還提供關鍵字is來進行資料類型的判斷。

強制類型轉換就是将一個類型的資料無條件的強制轉換為其他資料類型。具有安全的強制類型轉換和不安全的強制類型轉換。

int v1 = 98;

double v2 = (double)v1;

對于安全的強制類型轉換,可以将類型轉換運算符省掉,比如上述第二行代碼可以寫成“double v2 = v1;”

反過來,在這個強制類型轉換路徑上逆道行駛,則就是不安全的強制類型轉換,比如以下代碼就是不安全的強制類型轉換,

double v3 = 98.34;

int v4 = (int )v3;

這個轉換後,數值“98.34”被轉換為“98”,兩者不等,是以是不安全的,可能導緻程式錯誤,而且不安全的強制轉換中轉換符号不能省略,比如上面的第二行代碼就不能寫成“int v4 = v3 ;”。

類類型之間也能進行強制類型轉換,文法為“類型名稱 變量名=(類型名稱)變量名2”,比而且要保證要轉換的對象引用是轉換後的類型或者派生類。

如下所示,程式中定義了以下幾個類型,各個類型的繼承派生關系如下。

<a href="http://blog.51cto.com/attachment/201107/163158652.png" target="_blank"></a>

這幾個類型按照繼承關系形成一個以“System.Object”類型為唯一根節點的樹狀結構,從葉子節點出發到跟節點,形成多條安全的資料類型轉換路徑,例如“卡車類型→汽車類型→機械類型→Object”,和“大米類型→食品類型→Object”,沿着這條路徑進行類型轉換是安全的,肯定能轉換成功;反過來是不安全的類型轉換,可能不成功。

例如以下轉換過程是安全的,肯定成功

卡車類型 instance = new 卡車類型( ) ;

機械類型 instance2 = ( 機械類型 ) instance ;

以下轉換過程是不安全的,可能會失敗

機械類型 instance = new 卡車類型( ) ;

機械類型 instance2 = new 電鑽類型( ) ;

汽車類型 car1 = ( 汽車類型 ) instance1 ; // 不安全的轉換,能成功。

汽車類型 car2 = ( 汽車類型 ) instance2 ; // 不安全的轉換,不成功,會爆運作時錯誤。

若在這個類型繼承樹上憑空跳到另外一個節點,則就是不可能的類型轉換,而且會爆編譯錯誤的,例如以下的類型轉換的代碼就根本行不通。

卡車類型 instance = new 卡車類型( );

食品類型 instance2 =  ( 食品類型 ) instance ;

由于強制類型轉換可能會發生錯誤,C#提供一個使用關鍵字as的類型轉換。其文法為“要轉換的類型名稱 變量=  要轉換的變量 as 要轉換的類型名稱 ”,若轉換成功則會設定變量值,若轉換失敗則設定變量值為空引用。[袁永福原創]

例如對于上節課程提到的資料類型轉換路徑“卡車類型→汽車類型→機械類型→Object”,則可以執行以下的代碼

汽車類型 instance = new 卡車類型( );

客車類型 bus = instance  as  客車類型 ;

由于這是不安全的轉換,轉換失敗,此時程式不會報錯,但會設定變量bus為空引用。

對于以下代碼

卡車類型 instance2 = instance as 卡車類型;

這是安全的轉換,轉換成功,會設定變量instance2的變量指向某個對象執行個體。

使用as類型轉換比強制類型轉換的好處就是轉換失敗時不會發生錯誤,此時應用程式需要檢查轉換結果值來判斷轉換是否成功。[袁永福原創]

C#提供關鍵字is來進行類型判斷,其用法為“變量名 is 類型名稱”,這是一個表達式,傳回的是布爾值,用于判斷指定的對象執行個體可否轉換為指定的類型。例如執行以下代碼

機械類型 instance = new 卡車類型( );

bool result = instance is 汽車類型 ;

由于此處instance指向的是一個卡車類型,而卡車類型是汽車類型的派生類,可以轉換為汽車類型,是以instance是類型汽車類型,是以result的值為true。

使用關鍵字is的類型判斷能判斷對象是否是指定的類型或者派生類型,也可判斷是否實作了指定的接口,而且這個過程不會報錯。[袁永福原創]

     本文轉自xdesigner 51CTO部落格,原文連結:http://blog.51cto.com/xdesigner/624601,如需轉載請自行聯系原作者