Си диез / Говнокод #11946 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 LispGovno, (Updated )

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

  • Три, да три, да три - что будет? Дырка.
    Блин, вот было понятно, просто так - это значение, * - указатель, & - ссылка. Нет, взяли, упростили... А то указатели, видите ли, это слишком сложно.
    Ответить
    • Плюсую, сталкивался с этим в js, когда развешивал обработчики в виде лямбдочек в цикле.
      Ответить
  • Древний боян, Липпет уже разжевал еще года 3 назад.
    Ответить
  • "Сишарп: История изменений. От Явы к Яваскрипту." Спрашивайте в магазинах города.
    Ответить
  • к слову это поведение изменилось в C# 5. Если раньше он просто использовал переменную 'i' для замыкания, то после он будет еще одну переменную внутри foreach, в неё присваивать i, и дальше в теле foreach-а она и будет использоваться.
    ЗЫ. это типичный пример замыкания\closure
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8