《你不常用的c#之三》:Action 之怪状

例1:

 

 

输出结果:

例2:

 

则结果为:
为啥呢?我们来用windbg分析下:

 

对于例1,我们观看堆上的Action对象(System.Action )只有一个,
heap上的列表:

6c27166c 1 32 System.Action

你的foreach里其实都是循环的一个action
所以最后的时候是10(i的最后值)

而例2中则有10个
action对象在heap上的列表:

6c27166c 10 320 System.Action


10个,每个action里引用一个tp,
heap列表:

Address MT Size
01451790 6c27166c 32
014517dc 6c27166c 32
01451808 6c27166c 32
01451834 6c27166c 32
01451860 6c27166c 32
014518bc 6c27166c 32
014518e8 6c27166c 32
01451914 6c27166c 32
01451940 6c27166c 32
014519bc 6c27166c 32

随便看一个Address,比如这个01451914 ,dump出来的值是

MT Field Offset Type VT Attr Value Name
79102290 4000001 4 System.Int32 1 instance 7 tp

看到没,此时的tp还存在,值为7。

为了验证,我们可以

Action a1  =  ls[ 0 ]  as  Action;
Action a2  =  ls[ 1 ]  as  Action;
Console.WriteLine( object .ReferenceEquals(a1,a2));

第一个例子true,第二个(tp) 则为false。

看来我用windbg有点越俎代庖。

更确切说是VS编译器优化的问题,从MSIL代码可以看出

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值