錯誤4:注意隱性的數(shù)據(jù)類型轉(zhuǎn)換
Boxing和unboxing是使值型數(shù)據(jù)類型被當(dāng)作索引型數(shù)據(jù)類型使用的二個過程。值型變量可以被包裝進(jìn)一個對象中,然后再被解包回值型變量。包括內(nèi)置數(shù)據(jù)類型在內(nèi)的所有C#中的數(shù)據(jù)類型都可以被隱性地轉(zhuǎn)化為一個對象。包裝一個值型變量就會生成一個對象的實(shí)例,然后將變量拷貝到實(shí)例中。
Boxing是隱性的,如果在需要索引型數(shù)據(jù)類型的地方使用了值型數(shù)據(jù)類型的變量,值型變量就會隱性地轉(zhuǎn)化為索引型數(shù)據(jù)類型的變量。Boxing會影響代碼執(zhí)行的性能,因此應(yīng)當(dāng)盡量避免,尤其是在數(shù)據(jù)量較大的時候。
如果要將一個打包的對象轉(zhuǎn)換回原來的值型變量,必須顯性地對它進(jìn)行解包。解包需要二個步驟:首先對對象實(shí)例進(jìn)行檢查,確保它們是由值型的變量被包裝成的;第二步將實(shí)例中的值拷貝到值型變量中。為了確保解包成功,被解包的對象必須是通過打包一個值型變量的值生成的對象的索引。
using System;
public class UnboxingTest
{
public static void Main()
{
int i = 123;
//打包
object o = i;
// 解包(必須是顯性的)
int j = (int) o;
Console.WriteLine("j: {0}", j);
}
}
如果被解包的對象是無效的,或是一個不同數(shù)據(jù)類型對象的索引,就會產(chǎn)生InvalidCastException異外。
Boxing和unboxing是使值型數(shù)據(jù)類型被當(dāng)作索引型數(shù)據(jù)類型使用的二個過程。值型變量可以被包裝進(jìn)一個對象中,然后再被解包回值型變量。包括內(nèi)置數(shù)據(jù)類型在內(nèi)的所有C#中的數(shù)據(jù)類型都可以被隱性地轉(zhuǎn)化為一個對象。包裝一個值型變量就會生成一個對象的實(shí)例,然后將變量拷貝到實(shí)例中。
Boxing是隱性的,如果在需要索引型數(shù)據(jù)類型的地方使用了值型數(shù)據(jù)類型的變量,值型變量就會隱性地轉(zhuǎn)化為索引型數(shù)據(jù)類型的變量。Boxing會影響代碼執(zhí)行的性能,因此應(yīng)當(dāng)盡量避免,尤其是在數(shù)據(jù)量較大的時候。
如果要將一個打包的對象轉(zhuǎn)換回原來的值型變量,必須顯性地對它進(jìn)行解包。解包需要二個步驟:首先對對象實(shí)例進(jìn)行檢查,確保它們是由值型的變量被包裝成的;第二步將實(shí)例中的值拷貝到值型變量中。為了確保解包成功,被解包的對象必須是通過打包一個值型變量的值生成的對象的索引。
using System;
public class UnboxingTest
{
public static void Main()
{
int i = 123;
//打包
object o = i;
// 解包(必須是顯性的)
int j = (int) o;
Console.WriteLine("j: {0}", j);
}
}
如果被解包的對象是無效的,或是一個不同數(shù)據(jù)類型對象的索引,就會產(chǎn)生InvalidCastException異外。

