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

    +136

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    while (f != null && !string.IsNullOrEmpty(f.FileName) && f.ContentLength != 0)
    {
       if (f != null && !string.IsNullOrEmpty(f.FileName) && f.ContentLength != 0)
       {
          // ...
       }
    }

    Проверка на всякий случай

    Запостил: ReallyBugMeNot, 02 Февраля 2011

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

    • ну а вдруг после while файл зануллился
      Ответить
    • В другом потоке изменили
      Ответить
      • или в другом процессе вообще
        Ответить
      • Состояние изменилось в промежутке между двумя операциями? ну-ну
        Ответить
        • вероятность такая есть, поскольку операция не атомарна
          ваш кэп
          Ответить
          • Есть, но это всё не поможет, если f занулится после if.
            Ответить
            • нужно синхронизировать потоки и блочить файлы
              Ответить
              • >нужно синхронизировать потоки и блочить файлы
                Кто-то сомневался? 5487 - говнокод, тк этого нет.
                Ответить
    • Эту копипасту компилятор вырежет оптимизатором всё равно...
      Ответить
      • не вырежет
        Ответить
        • L_000c: callvirt instance string ConsoleApplication1.Foo::get_FileName()
          L_0011: call bool [mscorlib]System.String::IsNullOrEmpty(string)
          L_0016: brtrue.s L_001f
          L_0018: ldloc.0
          L_0019: callvirt instance int32 ConsoleApplication1.Foo::get_ContentLeng th()
          L_001e: pop
          L_001f: ldloc.0
          L_0020: brfalse.s L_0037
          L_0022: ldloc.0
          L_0023: callvirt instance string ConsoleApplication1.Foo::get_FileName()
          L_0028: call bool [mscorlib]System.String::IsNullOrEmpty(string)
          L_002d: brtrue.s L_0037
          L_002f: ldloc.0
          L_0030: callvirt instance int32 ConsoleApplication1.Foo::get_ContentLeng th()
          L_0035: brtrue.s L_0008
          Ответить
          • Оптимизацию включили?
            Вообще, любой нормальный доделаный современный компилятор умеет делать оптимизацию expression elimination. Неужели майкрософт в сишарпе это не осилила? В С++ ихнем эта оптимизация работает.
            Ответить
            • Это если выражение не имеет побочных эффектов. А как компилятор об этом узнает?
              Ответить
              • А это уже называется global optimization.

                А вообще, часть выражений с небольшой глубиной вложенности некоторые компиляторы вырезают даже без поддержки global optimization.
                Ответить
              • ага! никак не может узнать.

                здесь цикл,
                потом оператор, статический метод, метод экземпляра, метод экземпляра
                потом оператор, статический метод, метод экземпляра, метод экземпляра

                не смотря на код - или представляя себе другой код, как можно удалить из этого что-либо?

                давайте тогда сразу весь код на noop заменять и все дела :)
                Ответить
            • да, .NET 4.0, Release
              Ответить

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