文章目錄
第二章 控制語句
剛開始的時候,我們並不太能體會控制語句的重要性?我們為什麼需要控制語句呢?我們知道,程式的執行都是一行接一行、自上而下地進行,不遺漏任何代碼。如果所有的應用程式都這樣執行,那我們能做的工作就很有限了。如果我們需要進行有條件的執行或是迴圈的執行相同的代碼又該怎麼辦呢?顯然自上而下地進行執行代碼滿足不了需求;這時,我們就需要流程式控制制語句了,讓代碼有選擇性的執行或者迴圈。
本章我們重點向大家介紹控制語句的相關知識,希望對大家有所協助。
本章的學習重點:
◆ 隱式轉換
◆ 顯示轉換
2.2類型轉換
C#中的類型轉換有兩種分類方法,一種是根據轉換方式的不同進行劃分,可以分為顯式 (Explicit) 轉換和隱式 (Implicit) 轉換兩種;另外一種是根據源類型和目標類型之間的關係進行劃分,可以分為變換 (Conversion)、投射 (Cast)和裝箱/拆箱 (Boxing/Unboxing)。本文將向大家詳細介紹顯式轉換和隱式轉換的相關知識。
類型轉換髮生在什麼時候——當發生值的複製時,可能會發生類型轉換。所謂“值的複製”,包括賦值運算和方法傳參。如果被賦值的變數或方法的形式參數的類型與實際的物件類型不同,就需要進行類型轉換。
2.2.1隱式轉換
隱式轉換是指將低精度數值轉換為高精度數值,可以直接賦值而不用手動添加其他代碼。隱式轉換可能在多種情形下發生,包括在調用方法時或在指派陳述式中。例如:
int intValue = 10;
double doubleValue = intValue;
從int類型轉換到double類型就是一種隱式轉換。隱式轉換一般不會失敗,轉換過程中也不會導致資訊丟失。隱式轉換就是系統預設的、不需要加以聲明就可以進行的轉換。在隱式轉換過程中,編譯器無需對轉換進行詳細檢查就能夠安全地執行轉換。
隱式轉換:一般是低類型向高類型轉化,能夠保證值不發生變化。
下面我們列出了隱式數值的轉換規則:
從 sbyte 到 short、int、long、float、double 或 decimal。
從 byte 到 short、ushort、int、uint、long、ulong、float double 或 decimal。
從 short 到 int、long、float、double 或 decimal。
從 ushort 到 int、uint、long、ulong、float、double 或 decimal。
從 int 到 long、float、double 或 decimal。
從 uint 到 long、ulong、float、double 或 decimal。
從 long 到 float、double 或 decimal。
從 ulong 到 float、double 或 decimal。
從 char 到 ushort、int、uint、long、ulong、float、double 或 decimal。
從 float 到 double。
當然,沒必要記住它們,因為很容易看出編譯器可以執行哪些隱式轉換。之前的一個表列出了每種簡單數字類型的取值範圍。這些類型的隱式轉換規則是:任何類型A,只要其取值範圍完全包含在類型B的取值範圍內,就可以隱式轉換為類型B。
原因很簡單,如果要把一個值放在變數中,而該值超出了變數的取值範圍,就會出問題。例如,short類型的變數可以儲存0~32677的數字,而byte可以儲存的最大值是255,所以如果要把一個short值轉換為byte值就會出問題。如果short包含的值在256~32767之間,該數值就不能放在byte中。
但是,如果short類型變數中的值小於255,就能轉換這個值,對嗎?答案是可以,但必須使用顯示轉換,執行顯示轉換有點類似於“我已經知道你對我這麼做提出了警告,但我將對其後果負責”。顯示轉換我們將在下一節詳細介紹。
這裡還有幾點需要注意的:
1、不存在向 char 類型的隱式轉換,因此其它整型的值不會自動轉換為 char 類型。
2、浮點型不能隱式地轉化為decimal型。
2.2.2顯示轉換
顯式類型轉換,又叫強制類型轉換。與隱式轉換正好相反,是指當不存在相應的隱式轉換時,從一種數字類型到另一種數字類型的轉換。顯式轉換需要使用者明確地指定轉換的類型,而且不能保證資料的正確性。
其聲明文法如下:
(type)(運算式)
例如:下面的例子把一個long類型顯式轉換為int類型:
long longValue = 5000;
int intValue = (int)longValue;
顯式轉換可以發生在運算式的計算過程中。它並不是總能成功,而且常常可能引起資訊丟失。
顯式轉換包括所有的隱式轉換,也就是說把任何系統允許的隱式轉換寫成顯式轉換的形式都是允許的,例如:
int intValue = 10;
long longValue = (long)intValue;
下面我們列出了顯式數值的轉換規則:
從sbyte到byte,ushort,uint,ulong,或char。
從byte到sbyte或char。
從short到sbyte,byte,ushort,uint,ulong,或char。
從ushort到sbyte,byte,short,或char。
從int到sbyte,byte,short,ushort,uint,ulong,或char。
從uint到sbyte,byte,short,ushort,int,或char。
從long到sbyte,byte,short,ushort,int,uint,ulong,或char。
從ulong到sbyte,byte,short,ushort,int,uint,long,或char。
從char到sbyte,byte,或short。
從float到sbyte,byte,short,ushort,int,uint,long,ulong,char,或decimal。
從double到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,或decimal。
從decimal到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,或double。
這種類型轉換有可能丟失資訊或導致異常拋出,轉換按照下列規則進行:
1、對於從一種整型到另一種整型的轉換,編譯器將針對轉換進行溢出檢測,如果沒有發生溢出,轉換成功,否則拋出一個OverflowException異常。這種檢測還與編譯器中是否設定了checked選項有關。
2、對於從float,double或decimal到整型的轉換,源變數的值通過舍入到最接近的整型值作為轉換的結果。如果這個整型值超出了目標類型的範圍,則將拋出一個OverflowException異常。
3、對於從double到float的轉換,double值通過舍入取最接近的float值。如果這個值太小,結果將變成0。如果原double值是NaN,則轉換結果也是NaN。
4、對於從float或double到decimal的轉換,源值將轉換成小數形式並通過舍入取到小數點後28位(如果有必要的話)。如果源值太小,則結果為0;如果太大以致不能用小數表示,或是無窮和NaN,則將拋出InvalidCastException異常。
5、對於從decimal到float或double的轉換,小數的值通過舍入取最接近的值。這種轉換可能會丟失精度,但不會引起異常。