程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#3.0學習筆記(9)轉換

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

編輯:C#入門知識

 

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);

        }

}

  程序輸出結果為:

 \

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

 

作者:永遠的麥子

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved