1. C# / Говнокод #11946

    +140

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    var actions = new List<Action>();
    foreach (var i in Enumerable.Range(1, 3))
    {
        actions.Add(() => Console.WriteLine(i));
    }
    
    foreach (var action in actions)
    {
        action();
    }

    Внезапно:
    http://ideone.com/RaiHr
    http://ideone.com/EMQBA

    Запостил: LispGovno, 17 Октября 2012

    Комментарии (12) RSS

    • Три, да три, да три - что будет? Дырка.
      Блин, вот было понятно, просто так - это значение, * - указатель, & - ссылка. Нет, взяли, упростили... А то указатели, видите ли, это слишком сложно.
      Ответить
    • Наверное, каждый, кто писал на JavaScript, сталкивался с этим.
      Ответить
      • Плюсую, сталкивался с этим в js, когда развешивал обработчики в виде лямбдочек в цикле.
        Ответить
    • Древний боян, Липпет уже разжевал еще года 3 назад.
      Ответить
      • а где пруф на продукт разжевывания?
        Ответить
        • Дарю на русском
          http://www.rsdn.ru/article/csharp/Closure_in_Csharp.xml
          Ответить
        • А вот где разжевывается конкретно данный случай
          http://habrahabr.ru/post/141270/
          Ответить
    • "Сишарп: История изменений. От Явы к Яваскрипту." Спрашивайте в магазинах города.
      Ответить
    • к слову это поведение изменилось в C# 5. Если раньше он просто использовал переменную 'i' для замыкания, то после он будет еще одну переменную внутри foreach, в неё присваивать i, и дальше в теле foreach-а она и будет использоваться.
      ЗЫ. это типичный пример замыкания\closure
      Ответить
      • Это изменение касается только цикла foreach, поведение же цикла for никак не изменилось.
        Ответить
    • i = ++i + ++i
      Ответить

    Добавить комментарий