- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#语言类型系统提出的 1 一个核心概念装箱 (boxing) 和拆箱
(unboxing) 装箱和拆箱机制使得在 C#类型系统中任何值类型引用类型和
object 对
象类型之间进行转换我们称这种转化为绑定连接简单地说有了装箱和拆箱的
概念对任何类型的值来说最终我们都可以看作是 object 类型
4.3.1 装箱转换
装箱转换是指将一个值类型隐式地转换成一个 object 类型或者把这个值类型
转换成一个被该值类型应用的接口类型 interface-type 把一个值类型的值装
箱也
就是创建一个 object 实例并将这个值复制给这个 object 比如
int i = 10;
object obj = i;
用下图可以表示装箱的过程:
我们也可以用显式的方法来进行装箱操作
int i = 10;
object obj = object(i);
我们可以假想存在一个 boxing 类型其声明如下
class T_Box
{
T value;
T_Box(T t) {
value = t;
} // 该类型的构造函数
}
这里 T 表示将要装箱的值的类型它可以是 int char enum 等等现在我们要将
类型为 T 的值 v 装箱其执行过程为执行 new T_Box(v) 将其返回结果的实例作
为
对象类型的值那么下面的语句
int i = 10;
object obj = i;
等价于
int i = 10;
object obj = new int_Box(i); // 将 i 装箱成对象 obj
我们看一下下面的程序
程序清单 4-4
using System
class Test{
public static void Main(){
int i = 10;
object obj = i; // 对象类型
栈堆
i i 装箱后
int i=10
obj
object obj = i
10
int
10
if (obj is int) {
Console.Write(The value of i is boxing! );
}
i = 20; // 改变 i 的值
Console.WriteLine(int: i = {0}, i);
Console.WriteLine(object: obj = {0}, obj);
}
}
输出结果为
The value of i is boxing!
int: i = 20;
object: obj = 10;
这就证明了被装箱的类型的值是作为一个拷贝赋给对象的
4.3.2 拆箱转换
和装箱转换正好相反拆箱转换是指将一个对象类型显式地转换成一个值类型
或是将一个接口类型显式地转换成一个执行该接口的值类型
拆箱的过程分为两步首先检查这个对象实例看它是否为给定的值类型的装
箱值然后把这个实例的值拷贝给值类型的变量
我们举个例子来看看将一个对象拆箱的过程
int i = 10;
object obj = i;
int j = (int)obj;
这个过程用图来表示就是:
可以看出拆箱过程正好是装箱过程的逆过程必须注意装箱转换和拆箱转换必
须遵循类型兼容原则。
装箱和拆箱使我们可以把一个值类型当作一个引用类型来看待装箱转换是指将
一个值类型隐式地转换成一个 object 类型拆箱转换是指将一个 object 类型显
式
地转换成一个值类型它们互为逆过程。
原创力文档


文档评论(0)