本教程參考C#和ASP.NET程序設計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。
這次我們首先講解一下類型轉換,我們在寫程序時經常用到類型轉換,而且特別多的規則。我在這里粗略的講解一下。 隱式轉換是系統默認的、不需要加以聲明即可進行的轉換。 1.隱式數值轉換 隱式數值轉換實際上就是從低精度的數值類型轉換到高精度的數值類型的轉換。byte x=255;ushort y=x;y=65535;float z=y;//均從低精度到高精度,反之會產生溢出隱式數值轉換的類型太多,我就不多介紹,記住上面的原則就可以了。詳細規則可查看msdn 2.隱式枚舉轉換 隱式枚舉轉換用于把十進制整數0轉換成任何枚舉類型,對應的其他整數則不存在這種轉換。using System; enum Color { Red,Green,Blue }; class MikeCat { static void Main() { Color c;//聲明Color的變量c; c=0;//將0轉換為Red; Console.WriteLine("c的值是{0}",c);//結果:c的值是Red;如果將c=0改成c=1,則編譯器會給出錯誤。 } }3.隱式引用轉換 從任何引用類型到object的轉換。 從類類型A到類類型B的轉換,其中類A從類B派生得到。 從類類型A到接口類型B的轉換,其中類A實現了接口B。 從接口類型A到接口類型B的轉換,其中接口A是從接口B派生。 從任何數組類型到System.Array的轉換。 從任何委托類型到System.Delegate的轉換。 從任何數組類型或委托類型到System.ICloneable的轉換。 從空類型(null)到任何引用類型的轉換。 顯示轉換也稱為強制轉換,它需要用戶明確地指定轉換的類型。char c=(char)65;//A int i=(int)'A';//65顯示轉換包含所有的隱式轉換,即任何系統允許的隱式轉換寫成顯示轉換的形式都是允許的。int i=300; long l=(long)i;另外一例: using System; class MikeCat { static void Main() { long longValue = Int64.MaxValue; int intValue = (int) longValue; Console.WriteLine("(int){0} = {1}", longValue, intValue); } }類型 long 轉換為 int 是顯式轉換,它使用了強制轉換表達式。輸出為: (int) 9223372036854775807 = -1這是因為有溢出發生。 1.顯示數值轉換 顯示數值轉換是指當不存在相應的隱式轉換時從一種數值類型轉換為另一種數值類型。轉換類型也很繁瑣,只需記住轉換規則,詳細查閱MSDN。由于顯示數值轉換可能丟失信息或引發異常,因此轉換按以下原理被處理:簡略說就是高精度顯示轉換為低精度會引發異常(OverFlowException),未引發異常的情況,源變量的值通過舍入得到最接近的整型值作為轉換結果。詳細轉換時的異常情況查閱MSDN/*test.cs*/ using System; public class MikeCat { public static void Main() { ushort u=65535; byte b=(byte)u; Console.WriteLine("b的值是{0}",b); } }編譯狀況如下: E:\>csc test.cs Microsoft (R) Visual C# .NET 編譯器版本 7.10.3052.4 用于 Microsoft (R) .NET Framework 版本 1.1.4322 版權所有 (C) Microsoft Corporation 2001-2002。保留所有權利。 E:\>test.exe b的值是255 E:\>csc/checked test.cs ///checked[+|-] 生成溢出檢查 E:\>test.exe 未處理的異常: System.OverflowException: 算術運算導致溢出。 at MikeCat.Main() E:\>csc/checked- test.cs E:\>test.exe b的值是255 2.顯示枚舉轉換 顯示枚舉轉換其實就是將枚舉類型的元素類型與相應類型之間進行隱式顯示轉換。比如,有一個元素類型int的枚舉類型E,當執行從E到byte的顯示枚舉轉換時,實際執行的是從int到byte的顯示數值轉換。using System; enum Color { Red,Green,Blue }; public class MikeCat { static void Main() { Color c;//聲明Color的變量c; c=(Color)4;//對數字3進行顯示枚舉轉換 Console.WriteLine("c的值是{0}",c); } }結果:c的值是4 Convert 類 將一個基本數據類型轉換為另一個基本數據類型。 該類返回值與指定類型的值等效的類型。受支持的基類型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、 Double、Decimal、DateTime 和 String。
存在將每個基類型轉換為每個其他基類型的轉換方法。不過,所執行的實際轉換操作分為三類:
從某類型到它本身的轉換只返回該類型。不實際執行任何轉換。 無法產生有意義的結果的轉換引發 InvalidCastException。不實際執行任何轉換。下列轉換會引發異常:從 Char 轉換為 Boolean、Single、Double、Decimal 或 DateTime,以及從這些類型轉換為 Char。下列轉換會引發異常:從 DateTime 轉換為除 String 之外的任何類型,以及從任何類型(String 除外)轉換為 DateTime。 任何基類型(上面描述的基類型除外)都可以與任何其他基類型進行相互轉換。 如果數字類型轉換導致精度丟失(即某些最低有效位丟失),不引發異常。但是,如果結果超出了特定轉換方法的返回值類型所能表示的范圍,則將引發異常。
下面介紹一下和類型轉換相關的裝箱、取消裝箱 裝箱是值類型到 object 類型或到該值類型所實現的任何接口類型的隱式轉換。將一個值的值裝箱會分配一個對象實例并將該值復制到新的對象中。
請看以下值類型變量的聲明: int i = 123; 以下語句對變量 i 隱式應用裝箱操作: object o = i; 此語句的結果是在堆棧上創建對象 o,而該對象在堆上引用 int 類型的值。該值是賦給變量 i 的值類型值的一個副本。下圖說明了兩個變量 i 和 o 之間的差異。
裝箱轉換 在堆棧上 在堆上 i 123 int i=123; o (將i裝箱) object o=i; int 123 也可以(但絕不必要)如下例所示顯式執行裝箱: int i = 123; object o = (object) i; 示例 此例將整數變量 i 通過裝箱轉換為對象 o。這樣,存儲在變量 i 中的值就從 123 更改為 456。此例顯示對象保留了內容的原始副本,即 123。 // boxing.cs // Boxing an integer variable using System; class TestBoxing { public static void Main() { int i = 123; object o = i; // Implicit boxing i = 456; // Change the contents of i Console.WriteLine("The value-type value = {0}", i); Console.WriteLine("The object-type value = {0}", o); } }輸出 The value-type value = 456 The object-type value = 123
取消裝箱 取消裝箱是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。取消裝箱操作包括:
檢查對象實例,確保它是給定值類型的一個裝箱值。 將該值從實例復制到值類型變量中。 以下語句同時說明了裝箱和取消裝箱操作:
int i = 123; // A value type object box = i; // Boxing int j = (int)box; // Unboxing下圖顯示了以上語句的結果。
取消裝箱轉換 在堆棧上 在堆上 i 123 int i=123; o (將i裝箱) object o=i; int 123 j 123 int j=(int) o; 為使到給定值類型的取消裝箱轉換在運行時取得成功,源參數的值必須是對某個對象的引用,而該對象先前是通過將該值類型的值裝箱創建的。如果源參數為 null 或是對一個不兼容對象的引用,則會引發 InvalidCastException。 示例 下面的示例闡釋無效取消裝箱的情況,即錯誤的取消裝箱如何導致 InvalidCastException。通過使用 try 和 catch,發生錯誤時會顯示錯誤信息。 using System; public class UnboxingTest { public static void Main() { int intI = 123; // Boxing object o = intI; // Reference to incompatible object produces InvalidCastException try { int intJ = (short) o; Console.WriteLine("Unboxing OK."); } catch (InvalidCastException e) { Console.WriteLine("{0} Error: Incorrect unboxing.",e); } } } 輸出 System.InvalidCastException at UnboxingTest.Main() Error: Incorrect unboxing. 如果將下列語句: int intJ = (short) o; 更改為: int intJ = (int) o; 轉換將執行,而您將得到輸出“Unboxing OK”。
|