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); } }
程序輸出結果為:
關於轉換,今天先寫到這兒了,歡迎各位園友拍磚,謝謝!
作者:永遠的麥子