zoukankan      html  css  js  c++  java
  • 使用C# delegate的一种误区场景

    一个小弟特别喜欢使用delegate写代码。有一天他写了如下一段代码:

    1 Action[] action = new Action[6];
    2 for (int i = 0; i < action.Count(); i++)
    3 {
    4 action[i] = () => Console.WriteLine(i);
    5 }
    6 foreach (Action a in action)
    7 {
    8 a();
    9 }
    10  

     这段代码目的是想打印0到5,但是实际结果是

    通过反汇编调试,可以简单地说:delegate存的仅仅是变量 i 的地址,所有的delegate当调用的时候都是到同一地址取值,于是经过6次循环, i已经变成6,所以打印出来全是6。

    对于普通程序员来说,我觉得这是挺容易出错的,得不到期望值,而且不容易发现。

    一个简单解决方法:

    1 Action[] action = new Action[6];
    2 for (int i = 0; i < action.Count(); i++)
    3 {
    4 int j = i;
    5 action[i] = () => Console.WriteLine(j);
    6 }
    7 foreach (Action a in action)
    8 {
    9 a();
    10 }
    11  
  • 相关阅读:
    [POI2014]KUR-Couriers
    MySQL有哪些索引
    索引的设计原则
    explain参数之extra
    explain参数之type
    explain参数之select_type
    如何查询最后一行的记录
    为什么MySQL自增id不连续?
    MySQL字符集
    MySQL有哪些优化策略?
  • 原文地址:https://www.cnblogs.com/lxg226/p/1823540.html
Copyright © 2011-2022 走看看