C#3.0學習筆記(9)轉換

來源:互聯網
上載者:User

1, 什麼是轉換?

       答:轉換是接受一個類型的值並使用它作為另一個類型的等價值的過程。

 

2, 隱式轉換?

       語言(C#)會自動做這些轉換,並且轉換不會遺失資料或精度,這叫隱式轉換。

       例如,將8位的值轉換為16位的值。

 

3, 顯式轉換(或稱強制轉換)?

       對於語言不提供自動轉換的,如果仍要將源類型轉換為目標類型的,就叫顯式轉換。

       隱式轉換時遺失資料或精度由程式負責,顯式轉換時遺失資料或精度由程式員負責。

       例如:

       class Program

{

static voidMain(string[] args)

{

ushort sh = 10;

byte sb = (byte)sh; //顯式轉換

Console.WriteLine("sb={0},此時數據沒有遺失。",sb);



sh = 1365;

sb = (byte)sh;//顯式轉換

Console.WriteLine("sb={0},此時數據遺失了。",sb);

Console.ReadKey();

}

}

        程式輸出結果為:

   

 

4, 轉換的類型?

       如所示:

      

5, 數位轉換?

  1>    隱式數字轉換:

         佔據較少位的數字類型可以隱式轉換為佔據較多位的數字類型。

  2>    顯示數字轉換:

          例如:

       class Program

{

static voidMain(string[] args)

{

ushort sh = 2000;

byte sb;



sb = unchecked((byte)sh); //unchecked運算符,不檢測溢出,大多數重要的位遺失了。

Console.WriteLine("sb={0}",sb);

Console.ReadKey();

sb = checked((byte)sh); //checked運算符,檢測溢出,拋出OverflowException異常。

Console.WriteLine("sb={0}", sb);

Console.ReadKey();

}

}


6, 引用轉換?

       引用轉換接受源引用並返回一個指向堆中同一位置的引用,但是把引用“標記”為其它類型。

       例如:

         class A { public int Field1;}

class B : A { public int Field2; }

class Program

{

static voidMain(string[] args)

{

B myVar1 = new B();

A myVar2 = (A)myVar1; //強制轉換,作業A類的引用返回myVar1的引用。

Console.WriteLine("{0}",myVar2.Field1); //正確

Console.ReadKey();

Console.WriteLine("{0}",myVar2.Field2); //編譯錯誤,因為Field2對於myVar2不可見。

}

}


7, 裝箱(Boxing)?

       定義:裝箱是一種接受實值型別的值,根據這個值在堆上建立一個完整的參考型別對象             並返回對象引用的隱式轉換。

       例如:

       class Program

{

static voidMain(string[] args)

{

int i = 10; //創建並初始化值類型。

object oi = i; //創建並初始化引用類型(使用裝箱後變量i的副本進行初始化)。

Console.WriteLine("i={0},oi={1}",i,oi);

//示範了i和oi是如何被獨立操作的。

i = 12;

oi = 15;

Console.WriteLine("i={0},oi={1}", i, oi);



Console.ReadKey();

}

}

    程式輸出結果為:

         程式在記憶體中的布局如所示:       

8, 拆箱(unboxing)?

       定義:拆箱就是把裝箱後的對象轉換回實值型別的過程。

       需要注意的有以下幾點:

  1>    拆箱是顯式轉換。

  2>    嘗試拆箱一個值為非原始類型時會拋出一個InvalidCastException異常。

       例如:

       class Program

{

static voidMain(string[] args)

{

int i = 10; //建立並初始化實值型別。

object oi = i; //裝箱i並把引用賦值給oi.

int j = (int)oi; //拆箱並把值賦值給j.

Console.WriteLine("i={0},oi={1},j={2}",i,oi,j);

Console.ReadKey();

}

}

  程式輸出結果為:

 

 

9, 使用者自訂轉換?

  除了標準轉換外,我們還可以為類或結構定義隱式和顯式轉換,這叫使用者自訂轉換。

  需要注意以下幾點:

  1>    除了implicit和explicit關鍵詞之外,隱式和顯式轉換的聲明文法是一樣的。

  2>    需要public和static修飾符。

  例如:

class Program

{

static voidMain(string[] args)

{

Person bill = new Person("bill",25); //執行個體化對象。

int age = bill; //將Person對象轉換為int。

Console.WriteLine("Person Info:{0},{1}",bill.Name,age);



Person anon = 35; //將int轉換為Person對象。

Console.WriteLine("Person Info:{0},{1}", anon.Name, anon.Age);

Console.ReadKey();

}

}

class Person

{

public string Name; //聲明變數。

public int Age;

public Person(string name, int age) //建構函式,初始設定變數。

{

Name = name;

Age = age;

}

public static implicit operator int(Person p)//將Person轉換為int。

{

return p.Age;

}

public static implicit operator Person(int i)//將int轉換為Person。

{

return new Person("Nemo",i);

}

}

  程式輸出結果為:

 

 關於轉換,今天先寫到這兒了,歡迎各位園友拍磚,謝謝!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.