明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

C#系列圖文說明教程 [3]

[摘要]本教程參考C#和ASP.NET程序設(shè)計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。這次我們首先講解一下類型轉(zhuǎn)換,我們在寫程序時經(jīng)常用到類型轉(zhuǎn)換,而且特別多的規(guī)則。我在這里粗略的講解一下。隱式轉(zhuǎn)換是系統(tǒng)默認的、不需要加以聲明即可進行的轉(zhuǎn)換。1.隱式數(shù)值轉(zhuǎn)換隱式數(shù)值轉(zhuǎn)換實際上就是從...

本教程參考C#和ASP.NET程序設(shè)計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。

這次我們首先講解一下類型轉(zhuǎn)換,我們在寫程序時經(jīng)常用到類型轉(zhuǎn)換,而且特別多的規(guī)則。我在這里粗略的講解一下。
隱式轉(zhuǎn)換是系統(tǒng)默認的、不需要加以聲明即可進行的轉(zhuǎn)換。
1.隱式數(shù)值轉(zhuǎn)換
隱式數(shù)值轉(zhuǎn)換實際上就是從低精度的數(shù)值類型轉(zhuǎn)換到高精度的數(shù)值類型的轉(zhuǎn)換。byte x=255;ushort y=x;y=65535;float z=y;//均從低精度到高精度,反之會產(chǎn)生溢出隱式數(shù)值轉(zhuǎn)換的類型太多,我就不多介紹,記住上面的原則就可以了。詳細規(guī)則可查看msdn
2.隱式枚舉轉(zhuǎn)換
隱式枚舉轉(zhuǎn)換用于把十進制整數(shù)0轉(zhuǎn)換成任何枚舉類型,對應(yīng)的其他整數(shù)則不存在這種轉(zhuǎn)換。using System;
enum Color
{
    Red,Green,Blue
};
class MikeCat
{
     static void Main()
     {
          Color c;//聲明Color的變量c;
          c=0;//將0轉(zhuǎn)換為Red;
          Console.WriteLine("c的值是{0}",c);//結(jié)果:c的值是Red;如果將c=0改成c=1,則編譯器會給出錯誤。
      }
}3.隱式引用轉(zhuǎn)換
從任何引用類型到object的轉(zhuǎn)換。
從類類型A到類類型B的轉(zhuǎn)換,其中類A從類B派生得到。
從類類型A到接口類型B的轉(zhuǎn)換,其中類A實現(xiàn)了接口B。
從接口類型A到接口類型B的轉(zhuǎn)換,其中接口A是從接口B派生。
從任何數(shù)組類型到System.Array的轉(zhuǎn)換。
從任何委托類型到System.Delegate的轉(zhuǎn)換。
從任何數(shù)組類型或委托類型到System.ICloneable的轉(zhuǎn)換。
從空類型(null)到任何引用類型的轉(zhuǎn)換。
顯示轉(zhuǎn)換也稱為強制轉(zhuǎn)換,它需要用戶明確地指定轉(zhuǎn)換的類型。char c=(char)65;//A
int i=(int)'A';//65顯示轉(zhuǎn)換包含所有的隱式轉(zhuǎn)換,即任何系統(tǒng)允許的隱式轉(zhuǎn)換寫成顯示轉(zhuǎn)換的形式都是允許的。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 轉(zhuǎn)換為 int 是顯式轉(zhuǎn)換,它使用了強制轉(zhuǎn)換表達式。輸出為:
            (int) 9223372036854775807 = -1這是因為有溢出發(fā)生。
1.顯示數(shù)值轉(zhuǎn)換
顯示數(shù)值轉(zhuǎn)換是指當不存在相應(yīng)的隱式轉(zhuǎn)換時從一種數(shù)值類型轉(zhuǎn)換為另一種數(shù)值類型。轉(zhuǎn)換類型也很繁瑣,只需記住轉(zhuǎn)換規(guī)則,詳細查閱MSDN。由于顯示數(shù)值轉(zhuǎn)換可能丟失信息或引發(fā)異常,因此轉(zhuǎn)換按以下原理被處理:簡略說就是高精度顯示轉(zhuǎn)換為低精度會引發(fā)異常(OverFlowException),未引發(fā)異常的情況,源變量的值通過舍入得到最接近的整型值作為轉(zhuǎn)換結(jié)果。詳細轉(zhuǎn)換時的異常情況查閱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
                    版權(quán)所有 (C) Microsoft Corporation 2001-2002。保留所有權(quán)利。
                    E:\>test.exe
                    b的值是255
                    E:\>csc/checked test.cs ///checked[+ -] 生成溢出檢查
                    E:\>test.exe
                    未處理的異常: System.OverflowException: 算術(shù)運算導致溢出。
                    at MikeCat.Main()
                    E:\>csc/checked- test.cs
                    E:\>test.exe
                    b的值是255
2.顯示枚舉轉(zhuǎn)換
顯示枚舉轉(zhuǎn)換其實就是將枚舉類型的元素類型與相應(yīng)類型之間進行隱式顯示轉(zhuǎn)換。比如,有一個元素類型int的枚舉類型E,當執(zhí)行從E到byte的顯示枚舉轉(zhuǎn)換時,實際執(zhí)行的是從int到byte的顯示數(shù)值轉(zhuǎn)換。using System;
enum Color
{
    Red,Green,Blue
};
public class MikeCat
{
      static void Main()
      {
           Color c;//聲明Color的變量c;
           c=(Color)4;//對數(shù)字3進行顯示枚舉轉(zhuǎn)換
           Console.WriteLine("c的值是{0}",c);
      }
}結(jié)果:c的值是4
Convert 類
將一個基本數(shù)據(jù)類型轉(zhuǎn)換為另一個基本數(shù)據(jù)類型。
該類返回值與指定類型的值等效的類型。受支持的基類型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、 Double、Decimal、DateTime 和 String。

存在將每個基類型轉(zhuǎn)換為每個其他基類型的轉(zhuǎn)換方法。不過,所執(zhí)行的實際轉(zhuǎn)換操作分為三類:

從某類型到它本身的轉(zhuǎn)換只返回該類型。不實際執(zhí)行任何轉(zhuǎn)換。
無法產(chǎn)生有意義的結(jié)果的轉(zhuǎn)換引發(fā) InvalidCastException。不實際執(zhí)行任何轉(zhuǎn)換。下列轉(zhuǎn)換會引發(fā)異常:從 Char 轉(zhuǎn)換為 Boolean、Single、Double、Decimal 或 DateTime,以及從這些類型轉(zhuǎn)換為 Char。下列轉(zhuǎn)換會引發(fā)異常:從 DateTime 轉(zhuǎn)換為除 String 之外的任何類型,以及從任何類型(String 除外)轉(zhuǎn)換為 DateTime。
任何基類型(上面描述的基類型除外)都可以與任何其他基類型進行相互轉(zhuǎn)換。
如果數(shù)字類型轉(zhuǎn)換導致精度丟失(即某些最低有效位丟失),不引發(fā)異常。但是,如果結(jié)果超出了特定轉(zhuǎn)換方法的返回值類型所能表示的范圍,則將引發(fā)異常。

下面介紹一下和類型轉(zhuǎn)換相關(guān)的裝箱、取消裝箱
裝箱是值類型到 object 類型或到該值類型所實現(xiàn)的任何接口類型的隱式轉(zhuǎn)換。將一個值的值裝箱會分配一個對象實例并將該值復(fù)制到新的對象中。

請看以下值類型變量的聲明:
       int i = 123; 以下語句對變量 i 隱式應(yīng)用裝箱操作:
       object o = i;
此語句的結(jié)果是在堆棧上創(chuàng)建對象 o,而該對象在堆上引用 int 類型的值。該值是賦給變量 i 的值類型值的一個副本。下圖說明了兩個變量 i 和 o 之間的差異。

        裝箱轉(zhuǎn)換
        在堆棧上            在堆上
        i 123
        int i=123;
        o                    (將i裝箱)
        object o=i;            int 123
        也可以(但絕不必要)如下例所示顯式執(zhí)行裝箱:
        int i = 123;
        object o = (object) i;
示例
此例將整數(shù)變量 i 通過裝箱轉(zhuǎn)換為對象 o。這樣,存儲在變量 i 中的值就從 123 更改為 456。此例顯示對象保留了內(nèi)容的原始副本,即 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 類型到值類型或從接口類型到實現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。取消裝箱操作包括:

檢查對象實例,確保它是給定值類型的一個裝箱值。 
將該值從實例復(fù)制到值類型變量中。
以下語句同時說明了裝箱和取消裝箱操作:

int i = 123; // A value type
object box = i; // Boxing
int j = (int)box; // Unboxing下圖顯示了以上語句的結(jié)果。

取消裝箱轉(zhuǎn)換
        在堆棧上        在堆上
        i 123
        int i=123;
        o                (將i裝箱)
        object o=i;        int 123
        j 123
        int j=(int) o;
為使到給定值類型的取消裝箱轉(zhuǎn)換在運行時取得成功,源參數(shù)的值必須是對某個對象的引用,而該對象先前是通過將該值類型的值裝箱創(chuàng)建的。如果源參數(shù)為 null 或是對一個不兼容對象的引用,則會引發(fā) InvalidCastException。
示例
下面的示例闡釋無效取消裝箱的情況,即錯誤的取消裝箱如何導致 InvalidCastException。通過使用 try 和 catch,發(fā)生錯誤時會顯示錯誤信息。
      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;
        轉(zhuǎn)換將執(zhí)行,而您將得到輸出“Unboxing OK”。