日落20190418001 - C#基础之装箱拆箱Story

(1)装箱过程

客户->银行职员: 需要把我的资产(值)存进保险库(堆)
银行职员->保险库: 找到一个可以放得下这批资产的保险库(分配堆内存)
银行职员->保险库: 还得额外做两个事务,一是对这批资产的类型做标记(类型对象指针),
银行职员->保险库: 二是记录资产信息和加个锁(同步块索引)
银行职员->客户: 您好,保险库开好了
客户->银行职员: 给,这是我要存的资产
银行职员->保险库: 把客户的资产存进保险库(值复制到刚分配的内存堆中)
银行职员->客户: 这是您的资产的所属账户(返回对象地址),
银行职员->客户: 现在您的资产已保管在保险库里(值类型变成引用类型)

客户银行职员保险库需要把我的资产(值)存进保险库(堆)找到一个可以放得下这批资产的保险库(分配堆内存)还得额外做两个事务,一是对这批资产的类型做标记(类型对象指针),二是记录资产信息和加个锁(同步块索引)您好,保险库开好了给,这是我要存的资产把客户的资产存进保险库(值复制到刚分配的内存堆中)这是您的资产的所属账户(返回对象地址),现在您的资产已保管在保险库里(值类型变成引用类型)客户银行职员保险库装箱(boxing)
(2)拆箱过程

客户->银行职员: 我要把我的资产(值)从保险库(堆)取出
银行职员->客户: 好的,请提供您的账户信息
客户->银行职员: 给,这是我的账户信息
银行职员->客户: 好的,已确认您的账户信息,请这边来
客户->银行职员: ?
银行职员->客户: (把客户带到保险库前)这是您的资产,你去保险库取吧
客户->银行职员: What?存进来的时候,不是你替我放的吗?怎么取的时候要自己来?
银行职员->客户: 因为规定(拆箱)只到这步,把资产从保险库取出(从堆中复制到基于栈的实例)是客户的事情
客户->银行职员: #%&^Q#%*

客户银行职员我要把我的资产(值)从保险库(堆)取出好的,请提供您的账户信息给,这是我的账户信息好的,已确认您的账户信息,请这边来(把客户带到保险库前)这是您的资产,你去保险库取吧What?存进来的时候,不是你替我放的吗?怎么取的时候要自己来?因为规定(拆箱)只到这步,把资产从保险库取出(从堆中复制到基于栈的实例)是客户的事情客户银行职员拆箱(unboxing)

以上简单回顾。

参考资料:

《CLR via C#(第3版)》第5.3节

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章