C#圖解教程學習筆記——轉換

1、什麼是轉換
轉換(conversion)是指接受一個類型的值並使用它做爲另外一個類型的等價值的過程。轉換後的值應和源值是同樣的,但其類型爲目標類型。安全

 

2、隱式轉換和顯式轉換(強制轉換)
1. 隱式轉換
(1)語言會自動作這些轉換。
(2)不會丟失數據或精度,通常是短類型轉換爲長類型。
(2)從位數更少的源類型轉換爲位數更多的目標類型時,目標中多出來的位須要用0或1填充。
當從更小的無符號類型轉換爲更大的無符號類型時,目標類型多出來的最高位都以0進行填充,這叫作零擴展(zero extension);對於有符號類型的轉換而言,額外的高位用源表達式的符號位進行填充,這叫作符號擴展(sign extension)。這樣就維持了被轉換的值的正確符號和大小。
2. 顯式轉換(強制轉換)
若是須要把長類型轉換爲短類型,目標類型可能沒法在不丟失數據的狀況下提供源值,這時必須使用顯式轉換(強制轉換)表達式。
語法:spa

3. 溢出檢測上下文
代碼片斷是否被檢查稱做溢出檢測上下文。默認的溢出檢測上下文是不檢查。
顯式轉換可能會丟失數據而且不能在目標類型中同等地表示源值。對於整數類型,C#給咱們提供了選擇運行時是否應該在進行類型轉換時檢測結果溢出的能力。這將經過checked運算符和checked語句來實現。
若是咱們指定一個表達式或一段代碼爲checked,CLR會在轉換產生溢出時拋出一個OverflowException異常。若是不指定爲checked,轉換會繼續而無論是否產生溢出。
(1)checked和unchecked運算符
checked和unchecked運算符用於控制表達式的溢出檢測上下文。(表達式不能是一個方法)
示例:3d

(2)checked和unchecked語句
checked和unchecked語句用於控制一個代碼塊中的全部轉換。
示例:對象

 

3、引用轉換
引用類型對象由引用和數據兩部分組成,引用轉換接受源引用並返回一個指向堆中同一位置的引用,可是把引用「標記」爲其餘類型。
1. 隱式引用轉換
(1)全部引用類型均可以被隱式轉換爲object類型。
(2)任何類型均可以隱式轉換到它繼承的接口。
(3)類能夠隱式轉換到:它繼承鏈中的任何類、它實現的任何接口。
2. 顯式引用轉換
顯式引用轉換是從一個普通類型到一個更精確類型的引用轉換。
顯式引用轉換包括:
(1)從object到任何引用類型的轉換。
(2)從父類到子類的轉換。
3. 有效顯式引用轉換
在運行時能成功進行(不拋出InvalidCastException異常)的顯示轉換有3種狀況。
(1)顯式轉換是不必的,即語言已經爲咱們進行了隱式轉換。例如,從衍生類到基類的轉換老是隱式轉換。
(2)源引用是null。
示例:blog

(3)由源引用指向的實際數據能夠被安全地進行隱式轉換。繼承

 

4、裝箱轉換和拆箱轉換
1. 裝箱轉換
裝箱是一種隱式轉換,它接受值類型的值,根據這個值在堆上建立一個完整的引用類型對象並返回對象引用。
裝箱是建立副本,在裝箱後,該值有兩份副本–原始值類型和引用類型副本,每一個均可以獨立操做。
示例:接口

圖示:ci

2. 拆箱轉換
拆箱(unboxing)是把裝箱後的對象轉換回值類型的過程。
(1)拆箱是顯式轉換。
(2)系統在拆箱時執行以下步驟:
它檢測到要拆箱的對象實際是ValueTypeT的裝箱值。
它把對象的值複製到變量。
示例:it

 

5、用戶自定義轉換
1. 用戶自定義轉換語法io

2. 用戶自定義轉換的約束
(1)只能夠爲類和結構定義用戶自定義轉換。
(2)不能重定義標準隱式轉換或顯式轉換。
(3)對於源類型S和目標類型T,以下命題爲真:
S和T必須是不一樣類型;
S和T不能經過繼承關聯;
S和T都不能是接口類型或object類型;
轉換運算符必須是S或T的成員。
3. 用戶自定義轉換示例
示例:

使用implicit運算符定義轉換,使用的是隱式轉換。若是使用explicit運算符來定義轉換,則須要使用強制轉換表達式來進行轉換。
示例:

4. 多步用戶自定義轉換
用戶自定義轉換在完成轉換中最多能夠有3個步驟。
示例:

圖示:

 

6、is運算符和as運算符
1. is運算符
檢查轉換是否會成功完成。
語法:

只可用於引用轉換、裝箱、拆箱,不能用於用戶自定義轉換。
2. as運算符
用於強制類型轉換,若是轉換失敗,返回null而不是拋出異常。
語法:

只能用於引用轉換和裝箱轉換,不能用於用戶自定義轉換或到值類型的轉換。

相關文章
相關標籤/搜索