review——C# (15)转换
FROM P286
1.數(shù)字的轉(zhuǎn)換
1.1溢出檢測上下文
顯示轉(zhuǎn)換可能會丟失數(shù)據(jù)并且不能在目標(biāo)類型中同等地表示源值。對于整數(shù)類型,C#給我們提供了選擇運(yùn)行時是否應(yīng)該在進(jìn)行類型轉(zhuǎn)換時檢測結(jié)果溢出的能力。通過checked運(yùn)算符和checked語句來實(shí)現(xiàn)。
□代碼片段是否被檢查稱作溢出檢測上下文
--如果我們指定一個表達(dá)式或一段代碼為checked,CLR會在轉(zhuǎn)換產(chǎn)生溢出時拋出一個OverFlowException異常。
--如果代碼不是checked,轉(zhuǎn)換會繼續(xù)而不管是否產(chǎn)生溢出
(1)checked和unchecked運(yùn)算符
*控制表達(dá)式的溢出檢測上下文。表達(dá)式放置在一對圓括號內(nèi)并且不能是一個方法。語法如下:
checked(表達(dá)式)、unchecked(表達(dá)式)
(2)checked語句和unchecked語句
作為運(yùn)算符時用于圓括號內(nèi)的單個表達(dá)式。而用作語句時執(zhí)行相同的功能,但控制的是一塊代碼中的所有轉(zhuǎn)換,而不是單個表達(dá)式。
□checked語句和unchecked語句可以被嵌套在任意層次
2.引用轉(zhuǎn)換
引用類型對象由內(nèi)存中的兩部分組成:引用和數(shù)據(jù)。
□由引用保存的那部分信息是它指向的數(shù)據(jù)類型。
□引用類型接受源引用并返回一個指向堆中同一位置的引用,但是把引用“標(biāo)記”為其他類型。
?
2.1隱式引用轉(zhuǎn)換
與語言為我們自動實(shí)現(xiàn)的隱式數(shù)字轉(zhuǎn)換類似,還有隱式引用轉(zhuǎn)換。
□所有引用類型可以被隱式轉(zhuǎn)換為object類型。
□任何類型可以隱式轉(zhuǎn)換到它繼承的接口
□類可以隱式轉(zhuǎn)換到
--它繼承鏈中的任何類
--它實(shí)現(xiàn)的任何接口
?
?
?2.2顯式引用轉(zhuǎn)換
顯式引用轉(zhuǎn)換是從一個普通類型到一個更精確類型的引用轉(zhuǎn)換。
包括:
□
--從object到任何引用類型的轉(zhuǎn)換
--從基類到從它繼承的類的轉(zhuǎn)換
□倒轉(zhuǎn)16-18、16-19的箭頭方向,即可以演示顯式引用轉(zhuǎn)換。
如果轉(zhuǎn)換的類型不受限制,很可能會導(dǎo)致我們很容易地嘗試引用在內(nèi)存中實(shí)際并不存在的類成員。然而,編譯器確實(shí)允許這樣的轉(zhuǎn)換。到那時,若系統(tǒng)在運(yùn)行時遇到它們則會拋出一個異常。
2.3有效顯示引用轉(zhuǎn)換
(1)顯示轉(zhuǎn)換是沒有必要的。即,語言已經(jīng)為我們進(jìn)行了隱式轉(zhuǎn)換。e.g.
?
(2)源引用是null。e.g.,在下面的代碼中,即使轉(zhuǎn)換基類的引用到衍生類的引用通常會是不安全的,但由于源引用是null,這種轉(zhuǎn)換還是允許的。
(3)由源引用指向的實(shí)際數(shù)據(jù)可以安全地進(jìn)行隱式轉(zhuǎn)換。
3.裝箱操作 (值=》引用)
包括值類型在內(nèi)的所有C#類型都派生自object類型。然而,值類型是高效輕量的類型,因?yàn)槟J(rèn)情況下在堆上不包括它們的對象組件。然而,如果需要對象組件,可以使用裝箱(boxing)。裝箱是一種隱式轉(zhuǎn)換,它接收值類型的值,根據(jù)這個值在堆上創(chuàng)建一個完整的引用類型對象并返回對象引用。
3.1裝箱是創(chuàng)建副本
一個有關(guān)裝箱的普遍誤解是在被裝箱的項(xiàng)上發(fā)生了一些操作。其實(shí)不是,它返回的是值引用類型副本。在裝箱產(chǎn)生之后,該值有兩份副本,原始值類型和引用類型副本,每一個都可以獨(dú)立操作。
?
4.拆箱轉(zhuǎn)換 (引用=》值)
拆箱(unboxing)是把裝箱后的對象轉(zhuǎn)回值類型的過程。
□拆箱是顯示轉(zhuǎn)換
□系統(tǒng)在把值拆箱城ValueTypeT時執(zhí)行了如下的步驟:
--它檢測到要拆箱的對象實(shí)際上是ValueTypeT的裝箱值。
--它把對象的值賦值到變量
?
?
5.is運(yùn)算符
如先前所說,有些轉(zhuǎn)換是不成功的,并且會在運(yùn)行時拋出一個InvalidCastException異常,我們可以使用is運(yùn)算符來檢查轉(zhuǎn)換是否會成功完成,從而避免盲目嘗試轉(zhuǎn)換。
Expr is TargetType? ?返回bool?
如果Expr可以通過以下方式成功轉(zhuǎn)換成目標(biāo)類型,則返回true
□引用轉(zhuǎn)換
□裝箱操作
□拆箱操作(未找到例子)
通過裝箱操作可轉(zhuǎn)換成目標(biāo)類型的例子:
static void Main(string[] args){int t = 5;object k = t;if (k is int)Console.WriteLine("!!"); Console.Read();}輸出!!,說明k is int 判斷返回true。即對于某裝箱結(jié)果進(jìn)行判斷時,會自動將其拆箱結(jié)果與目標(biāo)類型進(jìn)行比較。
關(guān)于is的官方文檔(必看,有的內(nèi)容更加詳細(xì))
6.as運(yùn)算符
as運(yùn)算符和強(qiáng)制轉(zhuǎn)換運(yùn)算符類似,只是它不拋出異常。如果轉(zhuǎn)換失敗,它返回null,而不是拋出異常。
和is運(yùn)算符類似,as運(yùn)算符只能用于引用轉(zhuǎn)換和裝箱轉(zhuǎn)換,不能用于用戶自定義轉(zhuǎn)換或到值類型的轉(zhuǎn)換。
?
轉(zhuǎn)載于:https://www.cnblogs.com/quintessence/p/9131982.html
總結(jié)
以上是生活随笔為你收集整理的review——C# (15)转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 075两栖攻击舰2号舰下水!
- 下一篇: ZSU-23-4式23mm自行高射炮是意