類型轉換

知識點

  1. 值類型。   
    1. 值類型是在棧中分配內存,在聲明時初始化才能使用,不能爲null。       
    2. 值類型超出作用範圍系統自動釋放內存。       
    3. 主要由兩類組成:結構,枚舉(enum),結構分爲以下幾類:
      1. 整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong)           
      2. 浮點型(Float、Double)           
      3. decimal           
      4. bool           
      5. 用戶定義的結構(struct)
  2. 引用類型。   
    1. 引用類型在堆中分配內存,初始化時默認爲null。       
    2. 引用類型是通過垃圾回收機制進行回收。       
    3. 包括類、接口、委託、數組以及內置引用類型object與string。

 

 

(1) 隱式轉換:一般是低類型向高類型轉化,能夠保證值不發生變化。
        隱式數值轉換:
         從 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。
   不存在向 char 類型的隱式轉換,因此其它整型的值不會自動轉換爲 char 類型。
   浮點型不能隱式地轉化爲decimal型
   隱式枚舉轉換
  
           隱式枚舉轉換允許將十進制整數 0 轉換爲任何枚舉類型。

隱式引用轉換
           派生類向基類轉換
           隱式引用轉換是指一類引用類型之間的轉換,這種轉換總是可以成功,因此不需要在運行時進行任何檢查。

   裝箱轉換
           裝箱轉換允許將值類型隱式轉換爲引用類型。

(2)顯示轉換:也稱強制類型轉換。不能保證數據的正確性。
      (type)(表達式)

(3)用戶自定義轉換
      所有的用戶自定義轉換都是靜態的,要使用static關鍵字
      用戶自定義轉換分顯示和隱示,它們用implicit(隱式轉換)或 explicit(顯示轉換)關鍵字聲明。
      static 訪問修辭符 轉換修辭符 operator 轉換類型(參數)

示例:

using System;
struct Number
{
       private int value;
       public Number(int value)
       {
              this.value = value;
       }
       //用戶自定義整型到Number型的隱式轉換
       static public implicit operator Number(int value)
       {
              return new Number(value);
       }
       // 用戶自定義從Number型到整型的顯示轉換
       static public explicit operator int(Number n)
       {
              return n.value;
       }
       //用戶自定義從Number類型到string類型的隱式轉換
       static public implicit operator string(Number n)
       {
              return n.ToString();
       }
}

class Test
{
      static public void Main()
       {
              Number n;
              n= 10;    
              Console.WriteLine((int)n);
              //隱式轉換到string
              Console.WriteLine(n);  
      }
}

使用System.Convert類
       將一個基本數據類型轉換爲另一個基本數據類型。

使用Parse方法
大部份預定義值類型都有這個靜態方法,用來將相應的文本轉化爲相應的值類型。

裝箱和取消裝箱


 

  1. 裝箱 是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換。對值類型裝箱會在堆中分配一個對象實例,並將該值複製到新的對象中。    

    •   
  2. 拆箱(取消裝箱)是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。取消裝箱操作包括:   
  3. 檢查對象實例,確保它是給定值類型的一個裝箱值。(拆箱後沒有轉成原類型,編譯時不會出錯,但運行會出錯,所以一定要確保這一點。用GetType().ToString()判斷時一定要使用類型全稱,如:System.String 而不要用String。)

  4. 將該值從實例複製到值類型變量中。

 

       裝箱和取消裝箱使值類型能夠與 object 類型相互轉換。

       裝箱轉換允許將“值類型”隱式轉換爲“引用類型”。將“值類型”的值裝箱的操作包括:分配一個對象實例並將“值類型”的值複製到該實例中。

示例:

       此例將整數變量 i 通過裝箱轉換爲對象 o。此例顯示對象保留了內容的原始副本,即 123。

using System;
class TestBoxing
{
   public static void Main()
   {
      int i = 123;
      object o = i; // 隱式的裝箱
      i = 456;       // 改變變量i的值
      Console.WriteLine("The value-type value = {0}", i);       //456
Console.WriteLine("The object-type value = {0}", o); //123 是i的複製值
   }
}
取消裝箱轉換:取消裝箱轉換允許將引用類型顯式轉換爲值類型。

    取消裝箱操作包括以下兩個步驟:首先檢查該對象實例是否是某個給定的值類型的裝了箱的值,然後將值從實例中複製出來。
示例:

    下面的示例闡釋無效取消裝箱的情況,即錯誤的取消裝箱如何導致 InvalidCastException。通過使用 try 和 catch,發生錯誤時會顯示錯誤信息。
using System;
public class UnboxingTest
{
   public static void Main()
   {
      int intI = 123;
      object o = intI; //裝箱
      try
      {
         int intJ = (short) o; //取消裝箱無效,short不是裝了箱的值類型. 檢查該對象實例是否是某個給定的值類型的裝了箱的值
         Console.WriteLine("Unboxing OK.");
      }
      catch (InvalidCastException e)
      {
         Console.WriteLine("{0} Error: Incorrect unboxing.",e);
      }
   }
}

 

其它轉換用運算符
as
as 運算符用於執行引用類型的顯式類型轉換。 如果要轉換的類型與指定類型兼容,轉換就會成功;如果類型不兼容,則返回null。
       表達式as 類型
as 運算符類似於類型轉換,所不同的是,當轉換失敗時,as 運算符將返回null,而不是引發異常。
示例:
       object o1=”SomeString”;
       object o2=5;
       string s1=o1 as string; //類型兼容 s1=”SomeString”
       string s2=o2 as string; //s2=null

is
is 運算符用於檢查對象的類型是否與給定類型兼容(對象是該類型,或是派生於該類型)。
       表達式 is 類型
示例:
       int i=10;
       if ( i is object) //true
       {}

sizeof
sizeof 運算符用於獲得值類型的大小(以字節爲單位)。
       sizeof(type)
sizeof 運算符僅適用於值類型,而不適用於引用類型。
sizeof 運算符僅可用於 unsafe 模式。
示例:
       unsafe
       {
              Console.WriteLine(“{0}”,sizeof(int));
       }

本文摘自:http://hi.baidu.com/senlinmu110/blog/item/b59f4f09c65b6ed963d986fa.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章