转载自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. centos6.5 无线网卡配置

    来自:http://liqirui.blog.51cto.com/4662702/1344877         http://wiki.centos.org/zh/HowTos/Laptops/Wp ...

  2. MySQL优化器cost计算

    记录MySQL 5.5上,优化器进行cost计算的方法. 第一篇: 单表的cost计算 数据结构: 1. table_share: 包含了表的元数据,其中索引部分: key_info:一个key的结构 ...

  3. Gson ------ 实例演习

    [本文范围]: 本文并非JSON知识讲解资料,亦非GSON知识讲解资料,而是通过实例让开发人员了解通过Gson如何使Java对象和Json对象进行相互转换. [JSON参考资料]: Json快速入门: ...

  4. leecode 排列的学习

    前面写过3个排列.这里再写一次. 1.全部都不重复https://oj.leetcode.com/problems/permutations/ (使用交换法)只是本人对c++ stl不熟,不会把排列结 ...

  5. map/reduce实现 排序

    import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co ...

  6. phpDesigner 工具快捷键巧用

    Zend Studio工具默认的快捷方式, 如果你从事php工作, 自然能够体会到一些便利性, 比如CTRL+D, 可以直接复制当前一行, 这对于重复代码及调试都有很大帮助. Ctrl+U转换大小写之 ...

  7. SOA技术的进化史

    SOA 是一种程序设计思想,其实早在远古时代(计算机史)它就已经出现了.无非就是把系统分解,将数据和业务逻辑部分尽量独立出来,然后以服务形式提供给另外的系统共用. 那时也有一些可以实现 SOA 的工具 ...

  8. Oracle数据库中将一个数据库中一张表的数据导入到另外一张表

    INSERT INTO DBTHNEW.L_MEMBER_ROLE_REL SELECT    *FROM    DBTH.L_MEMBER_ROLE_REL

  9. art template前端模板引擎

    偶然看到后台有一段代码 采用的是art template的模板引擎 地址为 http://aui.github.io/artTemplate/ 这段代码很简洁 var html = template( ...

  10. 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导

    http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...