13.6 装箱和拆箱
在第1章介绍“.NET体系结构”的时候,我们就已经介绍了值类型的装箱和拆箱,请读者自行参阅1.4.2节。
和引用类型不同,类是引用类型,它可以被转换成object类型,或者它所实现的接口类型,也可以反过来,从object类型或它所实现的接口类型转换为它本来的类型,当然这个过程需要运行时类型检查,以确保类型转换的安全性。
结构是值类型,因此当它被转换为object类型,或者它所实现的接口类型的时候,就会执行装箱操作;同样,当执行相反操作的时候,就会执行拆箱操作。和类的类型转换最大的不同是,装箱和拆箱操作执行的是将结构的数据复制到或复制出装箱的实例对象。
接下来,我们使用一段代码来对比类和结构的装箱,看看它们之间有什么不同,如代码清单13-10所示。
代码清单13-10 结构和类的装箱、拆箱对比
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 public struct AddressBookEntry
6{
7 public string Name;//实例成员
8 public string MobilePhone;
9 public DateTime Birthday;
10
11//显式定义的构造函数
12 public AddressBookEntry(string name,string mobilePhone,string birthDay)
13{
14 if(name==null||mobilePhone==null||birthDay==null)throw new ArgumentException();
15 this.Name=name;
16 this.MobilePhone=mobilePhone;
17 this.Birthday=DateTime.Parse(birthDay);
18}
19
20 public void Print()
21{
22 System.Console.WriteLine(“姓名:{0}手机:{1}生日:{2}”,Name,MobilePhone,Birthday);
23}
24}
25
26 public class StructSample
27{
28 public static void Main()
29{
30 System.Console.WriteLine(“结构类型的装箱和拆箱:”);
31 AddressBookEntry e1=new AddressBookEntry("Tom","1234567","1990-1-1");
32 object o=e1;//装箱
33 AddressBookEntry e2=(AddressBookEntry)o;//拆箱
34//修改e2实例字段的值
35 e2.Name="Jerry";
36 e2.MobilePhone="7654321";
37 e2.Birthday=DateTime.Parse("1991-9-9");
38//检查e1和e2的实例字段的值是否一致
39 System.Console.WriteLine("e2:");
40 e2.Print();
41 System.Console.WriteLine("e1:");
42 e1.Print();
43}
44}
45}
上述代码的运行结果如下:
结构类型的装箱和拆箱:
e2:
姓名:Jerry 手机:7654321 生日:1991-9-9 0:00:00
e1:
姓名:Tom 手机:1234567 生日:1990-1-1 0:00:00