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

    +127.4

    1. 1
    idPlansList = ViewState["idPlansList"] is List<int> ? (List<int>)ViewState["idPlansList"] : new List<int>();

    Запостил: ilya_lysenko, 14 Октября 2009

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

    • не такой уж и говнокод, если idPlansList используется крайне редко , нет смысла его содержать в памяти, ну это в общих чертах я описал принцип, это сравнимо с вызовом статического конструктора при запросе статическому члену класса
      Ответить
    • А/М
      Ответить
    • нифига не похоже на гавнокод, у автора ложные гавноподозрения
      Ответить
    • если бы это содержалось в геттере переменной idPlansList то это говнокод. но в данном случае всё вполне оправдано. инициализация происходит единожды. никаких доп. накладок.
      Ответить
    • А вот это s-code. По одной почему-то не замеченной причине.
      ViewState - известный словарь (не дженериковый), хранит данные любых типов. А тут народ проверяет не на null, а на is! Т.е. что, в словаре под данным ключом может быть обжект другого типа?! Это способ 1) сделать помойку, и 2) дольше не найти косяк, если под тем же ключом где-то влепят обжект другого типа. Ну, создаётся каждый раз - и создаётся. Упасть-то не упало :)

      Более пральный вариант вроде такого:
      idPlansList = (List<int>)ViewState["idPlansList"] ?? new List<int>();
      Ответить
      • (List<int>)ViewState["idPlansList"] в случае несоответствия типа выкинет исключение, и до ?? даже дело не дойдет. Наверно имелось в виду
        idPlansList = ViewState["idPlansList"] as List<int> ?? new List<int>();
        Но как подсказывает MSDN Это развернется в код следующего типа
        idPlansList = (ViewState["idPlansList"] is List<int> )? (List<int>)ViewState["idPlansList"] : null)?? new List<int>();
        Наверно наиболее правильный вариант это
        List<int> tmp = ViewState["idPlansList"] as List<int>;
        idPlansList = tmp?? new List<int>();
        Ответить
        • Имелось в виду именно то, что написано. Если пролюбили тип значения в "словаре помоечного типа" (нетипизированном), пусть исключение вылезет СРАЗУ. Это же элементарно.
          Откуда такой страх перед исключениями в нужных ситуациях?
          Ответить
          • Исключений я не боюсь. но здесь сама конструкция ?? бессмысленна, потому что до второго операнда никогда дело не дойдет, если что-то не так - будет выкидываться исключение. К тому же автору и не нужно исключение, он знает что в таком случае нужно делать. или вы предлагаете всю эту консрукцию обернуть в try-catch и в catch блоке выставлять пустой список?
            Ответить
            • Бессмысленна?? Ну и ну...
              Азы объяснять? :) Если в словаре ничего нет (null), он приведётся к null. Если есть List<int>, приведётся к нему. Если не пусто и не List<int>, упадёт, т.к. прокосячили. Если же автор ТАК И ЗАДУМЫВАЛ хранить в словаре значения, то - в Индии сейчас тепло.
              Ответить
              • Да, тут вы правы. Но мне почему-то подумалось, что он там не на null проверяет, а просто у него по данному ключу может лежать что-то другое нежели List<int> и в таком случае он хочет пустой список. Но в таком случае ССЗБ.
                Ответить
        • Имелось в виду именно то, что написано. Если пролюбили тип значения в "словаре помоечного типа" (нетипизированном), пусть исключение вылезет СРАЗУ. Это же элементарно.
          Откуда такой страх перед исключениями в нужных ситуациях?
          Ответить
          • Оба-на... Неплохой код движка обсуждения :)
            Ответить
    • А, да, и пройтись один совершенно ЛИШНИЙ раз по словарю - никого уже, видимо, не парит.
      Ответить

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