型別轉換就是將一種型別轉換成另一種型別。轉換可以是隱式轉換或者顯式轉換,本節將詳細介紹這兩種轉換方式,並講解有關裝箱和拆箱的內容。
1. 隱式轉換
所謂隱式轉換就是不需要宣告就能進行的轉換。進行隱式轉換時,編譯器不需要進行檢查就能安全地進行轉換。表3.4列出了可以進行隱式轉換的資料型別。
表3.4 隱式型別轉換表
源 類 型 目標型別
sbyte short、int、long、float、double、decimal
byte short、ushort、int、uint、long、ulong、float、double或decimal
short int、long、float、double或decimal
ushort int、uint、long、ulong、float、double或decimal
int long、float、double或decimal
uint long、ulong、float、double 或 decimal
char ushort、int、uint、long、ulong、float、double或decimal
float double
ulong float、double或decimal
long float、double或decimal
從int、uint、long或ulong到float,以及從long或ulong到double的轉換可能導致精度損失,但是不會影響其數量級。其他的隱式轉換不會丟失任何資訊。
說明:對於不同值型別之間的轉換,如果從低精度、小範圍的資料型別轉換為高精度、大範圍是資料型別,可以使用隱式轉換。
【例3.8】將int型別的值隱式轉換成long型別,**如下。
01 int i=2011; //定義整形變數並初始化
02 long l=1; //定義長整形變數並初始化
03 l=i; //隱式轉換
2. 顯式轉換
顯式轉換也可以稱為強制轉換,需要在**中明確地宣告要轉換的型別。如果要在不存在隱式轉換的型別之間進行轉換,就需要使用顯式轉換。表3.5列出了需要進行顯式轉換的資料型別。
表3.5 顯式型別轉換表
源 類 型 目標型別
sbyte byte、ushort、uint、ulong或char
byte sbyte和char
short sbyte、byte、ushort、uint、ulong或char
ushort sbyte、byte、short或char
int sbyte、byte、short、ushort、uint、ulong或char
(續)源 類 型 目標型別
uint sbyte、byte、short、ushort、int或char
char sbyte、byte或short
float sbyte、byte、short、ushort、int、uint、long、ulong、char或decimal
ulong sbyte、byte、short、ushort、int、uint、long或char
long sbyte、byte、short、ushort、int、uint、ulong或char
double sbyte、byte、short、ushort、int、uint、ulong、long、char或decimal
decimal sbyte、byte、short、ushort、int、uint、ulong、long、char或double
由於顯式轉換包括所有隱式轉換和顯式轉換,因此總是可以使用強制轉換表示式從任何數值型別轉換為任何其他的數值型別。
【例3.9】建立乙個控制台應用程式,將double型別的x進行顯式型別轉換,**如下。
01 static void main(string args)
02
程式執行結果為19810927。
也可以通過
convert
關鍵字進行顯式型別轉換,上述例子還可以通過下面**實現。
【例3.10】建立乙個控制台應用程式,通過convert關鍵字進行顯式型別轉換,**如下。
01 double x = 19810927.0112; //建立double型別變數x
02 int y =
convert.toint32
(x); //通過convert關鍵字轉換
03 console.writeline(y); //輸出整型變數y
3. 裝箱和拆箱
將值型別轉換為引用型別的過程叫做裝箱
,相反,
將引用型別轉換為值型別的過程叫做拆箱
,下面將通過例子詳細介紹裝箱與拆箱的過程。
(1)裝箱
裝箱允許將值型別
隱式轉換
成引用型別
,下面通過乙個例項演示如何進行裝箱操作。
【例3.11】建立乙個控制台應用程式,宣告乙個整型變數i並賦值為2011,然後將其賦值到裝箱物件obj中,最後再改變變數i的值,**如下。(例項位置:光碟\mr\example\第3章\3.11)
**位置:光碟\mr\example\第3章\3.11\test06\test06\program.cs
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace test06
,裝箱之後的物件為", i, obj);
i = 927; //重新將i賦值為927
console.writeline("2、i的值為,裝箱之後的物件為", i, obj);
console.readline();}}
}
執行結果如圖3.6所示。
從程式執行結果可以看出,值型別變數的值複製到裝箱得到的物件中,裝箱後改變值型別變數的值,並不會影響裝箱物件的值。
(2)拆箱
拆箱允許將引用型別
顯式轉換
為值型別,
下面通過乙個示例演示拆箱的過程。
【例3.12】建立乙個控制台應用程式,宣告乙個整型變數i並賦值為2011然後將其複製到裝箱物件obj中,最後,進行拆箱操作將裝箱物件obj賦值給整型變數j,**如下。(例項位置:光碟\mr\example\第3章\3.12)
**位置:光碟\mr\example\第3章\3.12\test07\test07\program.cs
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace test07
,裝箱之後物件為", i, obj);
int j = (int)obj; //執行拆箱操作
console.writeline("拆箱操作:裝箱物件為,值為", obj, j);
console.readline();}}
}
執行結果如圖3.7所示。
說明:裝箱是將乙個值型別轉換為乙個物件型別(object),而拆箱則是將乙個物件型別顯式轉換為乙個值型別。對於裝箱而言,它是將被裝箱的值型別複製乙個副本來轉換,而對於拆箱而言,需要注意型別的相容性,例如,不能將乙個值為string的object型別轉換為int型別。
試一試:修改上面的例項,在「int j = (int)obj;」語句的上一行新增「i=927;」這條語句,然後再輸出相關變數的值。
裝箱和拆箱資料型別轉換
c 高階程式設計 第6版154頁。基類和派生類之間的資料型別轉換 myderived直接或間接派生於mybase,從myderived到mybase的轉換 myderived derivedobject new myderived mybase basecopy derivedobject myde...
型別的裝箱和拆箱
c 使用單類層次的單一繼承 所有類都繼承自object基類,而且不可能多重繼承。但是c 的介面提供了許多多重繼承的功能 型別的裝箱和拆箱 boxing and unboxing types 裝箱 boxing 和拆箱 unboxing 是使值型別 如整數 能夠被當成引用型別 物件 的處理過程。值被 ...
基於資料型別轉換 裝箱與拆箱 與常量詳解
隱式轉換 自動型別轉換 兩種型別要相容,原型別值域要小於目標型別值域,可以簡單的理解為由小轉大。public class test 顯示轉換 強制型別轉換 兩www.cppcns.com種型別要相容,原型別值域要大於目標型別值域,可以簡單的理解為由大轉小。缺點 1 資料溢位。2 精度丟失。數值型別之...