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