C 型別轉換之初級篇 1

2021-06-15 21:37:18 字數 1711 閱讀 6069

型別轉換的分類

學過程式設計的朋友都知道型別轉換,並且也都清楚「隱式轉換」、「顯式轉換」、「裝箱」、「拆箱」等概念。但是,型別轉換究竟有多少種?如何對其進行劃分?何時應該使用何種型別轉換?

本文將就這些問題進行乙個簡要解釋。需要說明的是,本文中的幾乎所有內容都來自我在講課過程中的積累,在此強烈感謝我的學員,尤其是對我的看法提出疑問和建議的學員!另外,本文不一定對您的實際程式設計工作有太多幫助,不過可以讓您對型別轉換有乙個新的理解。

1、相關概念

型別轉換發生的時機(occasion)——當發生值的複製時,可能會發生型別轉換。所謂「值的複製」,包括賦值運算和方法傳參。如果被賦值的變數或方法的形式引數的型別與實際的物件型別不同,就需要進行型別轉換。

下面給出兩種發生型別轉換的情況。 1

// 例1

2int

x = 10;

3long

y = x;

// 此處發生型別轉換,因為x與y的型別不同。4

5//

例2

6void

f(long

var) ...

7 8void

g() 9

...

13

源型別(source type) 和目標型別(destination type) ——當發生型別轉換時,被賦值的變數或方法的形參的型別稱為目標型別,而實際的物件的型別稱為源型別。

例如前面例1中,變數x的型別int是源型別,而變數y的型別long是目標型別;例2中,變數i的型別int是源型別,而方法f的形參var的型別long是目標型別。

2、型別轉換的分類

c#中的型別轉換有兩種分類方法,一種是根據轉換方式的不同進行劃分,可以分為顯式(explicit) 轉換和隱式(implicit) 轉換兩種;另外一種是根據源型別和目標型別之間的關係進行劃分,可以分為變換(conversion)、投射(cast)和裝箱/拆箱(boxing/unboxing)。

2.1顯式轉換和隱式轉換

從直觀上看,顯式和隱式轉換只是語法上面的差別。當發生型別轉換時,如果在**中明確指定了目標型別,則稱為顯式轉換,否則則稱為隱式轉換。

c#通過將形如「(目標型別)」這樣的語法構造放在待轉換物件的前面,來表示乙個顯式轉換。

下面的**介紹了在c#語言中進行顯式和隱式轉換時的語法。

intx = 10;

long

y = x;

// 隱式轉換

x = (

int)

long

;//

顯示轉換

需要注意的是,不是任意兩種型別之間都能隨意進行轉換的。另外,無論顯式轉換還是隱式轉換,都可能會失敗。

如果顯式轉換失敗,會在執行時丟擲異常(這個異常可能是invalidcastexception,也可能是invalidoperationexception、overflowexception等具體異常);如果隱式轉換失敗,則會在編譯時得到乙個錯誤,指出不能進行隱式轉換。

最後,隱式轉換也可以用顯式轉換替代,但顯式轉換不能用隱式轉換替代。換句話說,可以用顯式轉換的地方,用隱式轉換也沒什麼問題;但需要顯式轉換的地方,就一定不能用隱式轉換。

下面將從另外一種角度介紹各種不同的型別轉換。

華為OJ之初級篇

11.獎金提成 簡要描述 企業發放的獎金根據利潤提成。利潤低於或等於100000元的,獎金可提10 利潤高於100000元,低於200000元 100000 200000 時 低於100000元的部分按10 提成 高於100000元的部分,可提成7.5 200000 400000時,低於200000...

華為OJ之初級篇

21.數字統計 簡要描述 對輸入的整型陣列,輸出陣列元素中的最大值 最大值的個數 最小值和最小值的個數 詳細描述 介面說明 原型 voidoutputmaxandmin int pinputinteger,intinputnum,int pmaxvalue,int pmaxnum,int pminv...

華為OJ之初級篇

本文章旨在提供乙個互相學習和交流的平台,也作為oj刷題這段時光的記錄。本人非計算機科班出身,程式主要以實現功能性需求為主,暫不考慮效能 質量等因素。以下oj題目順序為成功通過機器驗證的順序,本篇題目全出自初級題系列。為了保證本文介面的簡潔性,以 片形式給出,見相關 答案點這裡 鏈結。1.在字串中找出...