转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6199891

例1:

 

public static void Main()
{
List<Action> ls = new List<Action>();
for (int i = 0; i < 10; i++)
{
ls.Add(() => Console.WriteLine(i));
}
foreach (Action action in ls)
{
action();
} Action a1 = ls[0] as Action;
Action a2 = ls[1] as Action;
Console.WriteLine(object.ReferenceEquals(a1,a2));
Console.Read();
}

输出结果:

例2:

public static void Main()
{
List<Action> ls = new List<Action>();
for (int i = 0; i < 10; i++)
{
int tp = i;
ls.Add(() => Console.WriteLine(tp));
}
foreach (Action action in ls)
{
action();
} Action a1 = ls[0] as Action;
Action a2 = ls[1] as Action;
Console.WriteLine(object.ReferenceEquals(a1,a2));
Console.Read();
}
则结果为:
为啥呢?我们来用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代码可以看出。

《你不常用的c#之三》:Action 之怪状的更多相关文章

  1. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  2. Spark常用函数讲解之Action操作

    摘要: RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集RDD有两种操作算子:         Trans ...

  3. 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  4. Informatica 常用组件Lookup之三 关系和平面文件查找

    创建查找转换时,您可以选择使用关系表或平面文件作为查找源. 关系查找 使用关系表作为查找源来创建查找转换时,您可以使用 ODBC 连接到查找源并导入表定义作为查找转换的结构. 仅可对关系查找使用以下选 ...

  5. Informatica 常用组件Aggregator之三 使用排序输入

    可以使用排序输入选项改善聚合转换性能.使用排序输入时,PowerCenter 会假定所有数据已按组排序.PowerCenter 读取某组的行时,它将执行聚合计算.需要时,它会将组信息存储在存储器中.要 ...

  6. Informatica 常用组件Filter之三 创建FIL

    在 Designer 中,切换到 Mapping Designer 并打开映射. 选择"转换-创建". 选择"过滤器转换",然后输入新的转换名称.过滤器转换的命 ...

  7. 《你不常用的c#之XX》

    你不常用的c#之一>:略谈unsafe http://blog.csdn.net/robingaoxb/article/details/6199508 <你不常用的c#之二>:略谈G ...

  8. C#中常用的系统内置委托

    在公共语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包括Action类的委托.Func类的委托.Predicate<T>委托.Comparison<T>委托等等.以 ...

  9. Android Action Bar简介

    Android Action Bar简介 Design: Action Bar Action Bar是在屏幕顶端的一部分内容,通常在整个app进行中都保持存在. 它提供了几个关键的功能: 1.使得重要 ...

随机推荐

  1. poj2104

    裸的主席树,没什么好说的 type node=record        l,r,s:longint;      end; ..] of node;     sa,rank,a,b,sum,head: ...

  2. android学习—— LayoutInflater的使用

    在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(),不同点是LayoutInflater是 用来找layout下xml布局文件,并且实例化!而fi ...

  3. NIO的学习

    参考 http://wenku.baidu.com/link?url=rq-BEp3Et4JRrE62f2Lv9hq8nT_Gq0XPb65h8OBqTAt-ILfqKmdjIhVEp8bctIdm0 ...

  4. 【转】谁说Vim不是IDE?(一)

    谁说Vim不是IDE?(一)   话说操作系统.编程语言和编辑器似乎是程序员永恒的吐槽话题,技术发展了几十年,大家讨论起这几个“之争”还是充满愤怒.津津乐道.有人描述过Emacs和VI程序员,大家沿着 ...

  5. General: Know How to Use InetAddress

    Modern applications often need the ability to learn information about hosts out on the network. One ...

  6. CentOS6.6从头到尾部署nginx与tomcat多实例 转

    前提条件: 1.需要一个全新的centos系统(本文中用到是centos6.6) 2.vmware虚拟机 3.vmware下安装centos系统,以NAT方式与宿主机相连 4.在centos系统中pi ...

  7. Freemarker的常用技巧总结

    Freemarker的常用技巧总结 Freemarker视频教程 1,截取字符串 有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度 < lt. ...

  8. WAMP不能启动MYSQL服务

    突然不知道怎么整的,就把wamp的mysql服务整个不能启动,忧桑. 点击重启Mysql服务: PHP集成环境WAMP中MYSQL的服务wampmysqld无法启动,总是提示 错误1067:进程意外终 ...

  9. CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件

    Java多线程编程是很考验一个程序猿水平的. 传统的WEB程序中.由于框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将全部的注意力放到了业务实现上.我们不过依照业务逻辑的要求.不停的积累自 ...

  10. Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种

    http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLa ...