1. 程式人生 > >C#==>型別轉換 與 裝箱拆箱

C#==>型別轉換 與 裝箱拆箱

1,型別轉換,C#有兩種轉化方式,隱式轉換和顯式轉換

     只要能保證值不會發生任何變化轉換就可以自動進行。

     這裡很重要一點就是要保證資料沒有丟失,只要沒有丟失,編譯器就可以執行下去

①隱式轉換

1byte最多表示11111111即8位資料,而兩個byte型相加,很容易就超過了8位,(※注意這裡強調的是很容易超過)

此例中255+10結果為100001001顯然超過了byte能儲存的最大值,

這樣編譯器就會產生一個錯誤。

但如果我們把 total定義為int型,那麼value1 + value2的結果就可以順利的儲存到int型中

如下

這一過程中,編譯器進行了隱式型別轉換。

②顯式型別轉換,是我們迫使編譯器一定要按我們的要求進行,即便有資料丟失的情況發生,也要轉換(※但往往這種資料丟失恰恰是我們所希望的)。

有一點要明確就是所有的顯式型別轉化都可能不安全

還是剛才的例子,其結果total為9

即便我們知道value1 + value2的結果會大於8為,我們也要這樣做,通過(byte)強制編譯器進行型別轉換,

265 換算成二進位制是100001001,因為total是byte型只能儲存8位所以total中結果是00001001=>9

2,裝箱與拆箱(有些地方也稱為取消裝箱)運用了隱式轉換和顯式轉換兩個方法。

裝箱是指把值型別轉化為引用型別。當 CLR 對值型別進行裝箱時,會將該值包裝到 System.Object 內部,再將後者儲存在託管堆上

拆箱是把裝箱得到的引用型別轉換為值型別。(※注意,是把裝箱得到的引用型別轉化為值型別)

裝箱與拆箱是配套使用的,會不可分

如果我們把隨便一個object這樣一個引用型別賦值給值型別,編譯器就會報錯,而裝箱的得到的就沒問題。

裝箱與拆箱的效能問題,MSDN上的原話是這樣描述的:

"相對於簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。對值型別進行裝箱時,必須分配並構造一個新物件。次之,取消裝箱所需的強制轉換也需要進行大量的計算。"

"如果必須頻繁地將值型別裝箱,則最好避免使用值型別,例如在非泛型集合類(如 )中。可以通過使用泛型集合(例如 )來避免將值型別裝箱。裝箱和取消裝箱都是需要大量運算的過程。對值型別進行裝箱時,必須建立一個全新的物件。此操作所需時間可比簡單的引用賦值操作長 20 倍。取消裝箱時,強制轉換過程所需時間可達賦值操作的四倍。"