(1)裝箱過程
客戶->銀行職員: 需要把我的資產(值)存進保險庫(堆)
銀行職員->保險庫: 找到一個可以放得下這批資產的保險庫(分配堆內存)
銀行職員->保險庫: 還得額外做兩個事務,一是對這批資產的類型做標記(類型對象指針),
銀行職員->保險庫: 二是記錄資產信息和加個鎖(同步塊索引)
銀行職員->客戶: 您好,保險庫開好了
客戶->銀行職員: 給,這是我要存的資產
銀行職員->保險庫: 把客戶的資產存進保險庫(值複製到剛分配的內存堆中)
銀行職員->客戶: 這是您的資產的所屬賬戶(返回對象地址),
銀行職員->客戶: 現在您的資產已保管在保險庫裏(值類型變成引用類型)
(2)拆箱過程
客戶->銀行職員: 我要把我的資產(值)從保險庫(堆)取出
銀行職員->客戶: 好的,請提供您的賬戶信息
客戶->銀行職員: 給,這是我的賬戶信息
銀行職員->客戶: 好的,已確認您的賬戶信息,請這邊來
客戶->銀行職員: ?
銀行職員->客戶: (把客戶帶到保險庫前)這是您的資產,你去保險庫取吧
客戶->銀行職員: What?存進來的時候,不是你替我放的嗎?怎麼取的時候要自己來?
銀行職員->客戶: 因爲規定(拆箱)只到這步,把資產從保險庫取出(從堆中複製到基於棧的實例)是客戶的事情
客戶->銀行職員: #%&^Q#%*
以上簡單回顧。
參考資料:
《CLR via C#(第3版)》第5.3節