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

    +141

    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, 16 Октября 2012

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

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

        А ForEach - это глубоко православная конструкция. Ибо, во-первых, безопасно - не вылезешь за границы списка или массива, во-вторых, кратко, ну а в-третьих он еще и ресурсы сам закрывает.
        Ответить
      • ForEach - это глубоко православная конструкция.
        Он оберегает использовавшего от болезней, порчи, сглаза, выхода за границы массива и оставленных незакрытыми ресурсов.
        self-fix
        Ответить
    • Вот по этому бородатые дядьки советуют не использовать мутабельные структуры в c#.
      Ответить
    • А это по мотивам этого поста: http://sergeyteplyakov.blogspot.com/2011/07/blog-post.html
      Ответить
    • Банальное незнание основ языка.
      здесь
      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);
      }

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

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