首页 新闻 会员 周边 捐助

C#接口为什么能够修改一个已装箱的值类型中的字段?

0
悬赏园豆:20 [待解决问题]

还有((接口类型)(值类型)).Method(参数)

执行之后已装箱的对象会被立即垃圾回收?

来自于 CLR via C# p126

hailiang2013的主页 hailiang2013 | 初学一级 | 园豆:94
提问于:2013-01-14 11:53
< >
分享
所有回答(4)
0

没懂!

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-14 12:04

我看了下p126页。感觉这小节的概念有点纽扣。我基于最原始的两个概念来理解这小节完全行得通。

1、p1=((接口)值类型p)。这句代码实际上将p装箱为引用类型并存储在p1上,过程上将p复制一份(记为p2)并将引用传递给p1。p与p2属于不同的两个副本。这时对p2的引用p1调用change只是针对p2副本,p1的值不会有改变。(书本上的代码为((接口)值类型p),即没有保存p1这个临时引用变量,所以在调用完其change后,因为已经没有成员对p1有引用所以就直接释放了)----垃圾回收是遍历每个对象,若没有被引用就释放

2、o1=((接口)引用类型o)。这句代码实际上是o引用类型封装为(因为是引用类型所以不会发生装箱)接口然后将引用传递给o1,o实际存储的对象记为o2,此时o与o1都为引用同一个对象o2的两个变量,所以对o1的改变会反映在o上(书本上的代码为((接口)引用类型o),尽管没有保存o1变量,但是其实际开销对象o2和变量o是引用同一个对象,所以不会回收对应的对象)

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-15 00:10
0

悟性贫贫,不能参透 楼主的意思。

Qlin | 园豆:2403 (老鸟四级) | 2013-01-14 12:13
0

垃圾回收机制,有自己的运行安排。没有固定的时间。

你也不知道垃圾回收机制什么时候运行

chenping2008 | 园豆:9836 (大侠五级) | 2013-01-14 13:07
0

不知道什么时候运行的,lz看看gc回收原理就明白了

卒子 | 园豆:588 (小虾三级) | 2013-01-14 17:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册