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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
var x = new { Items = new List<int> { 1, 2, 3 }.GetEnumerator() };
while (x.Items.MoveNext())
{
    Console.WriteLine(x.Items.Current);
}

http://ideone.com/Qzdki

Запостил: LispGovno LispGovno, (Updated )

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

  • var x = new { Items = new List<int> { 1, 2, 3 }.GetEnumerator().AssParallel() };
    Ответить
    • Если я ничего не путаю, засада исходного ГК заключается в том, что List<T>.Enumerator является структорой, т.е. передается по значению. А стало быть, каждый вызов x.Items возвращает новую копию Enumerator'а, который указывает на элемент перед первым и вызов Current на нем вообще не обязан давать что-то осмысленное. А вариант товарища @pi работает как надо, т.к. вызов x.Items единственный.
      Ответить
  • Что будет если вместо var написать dynamic? То mono 2.8 в ideone выдает мне ошибку.
    Ответить
    • Ну это же пример. Пример того как МС променяла надежность и понятность кода на его скорость.
      Стрелять в ногу стало проще и веселее.
      А шарп превратился в плюсы нового десятилетия.

      А ForEach - это глубоко православная конструкция. Ибо, во-первых, безопасно - не вылезешь за границы списка или массива, во-вторых, кратко, ну а в-третьих он еще и ресурсы сам закрывает.
      Ответить
    • ForEach - это глубоко православная конструкция.
      Он оберегает использовавшего от болезней, порчи, сглаза, выхода за границы массива и оставленных незакрытыми ресурсов.
      self-fix
      Ответить
  • Вот по этому бородатые дядьки советуют не использовать мутабельные структуры в c#.
    Ответить
  • Банальное незнание основ языка.
    здесь
    while (x.Items.MoveNext())

    берется новый енумератор и становится на первую позицию

    здесь
    Console.WriteLine(x.Items.Current);

    берется еще один новый енумератор, и без инициализации печатается его свойство Current

    из цикла нет выхода т.к. MoveNext всегда выполняется только один раз для нового экземпляра енумератора

    вот так
    var x = new { Items = new List<int> { 1, 2, 3 }.GetEnumerator() };
    var y = x.Items;
    while (y.MoveNext()) {
       Console.WriteLine(y.Current);
    }

    все работает правильно
    Ответить

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

Помни, guest, за тобой могут следить!

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


    8