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

    +115

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    private int? ID {
    	set {
    		if (ViewState["ID"] != null)
    			ViewState["ID"] = value;
    		else
    			ViewState.Add("ID", value);
    	}
    	get {
    		if (ViewState["ID"] != null)
    			return Convert.ToInt32(ViewState["ID"]);
    		else
    			return null;
    	}
    }

    Запостил: Back, 24 Июня 2010

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

    • Видимо стоит добавить правильный код для контраста:
      private int? ID {
      set {
      ViewState["ID"] = value;
      }
      get {
      return (int?)ViewState["ID"];
      }
      }
      Ответить
    • Если быть до конца правильным, то лучше делать так:
      private int? ID
      {
      set
      {
      if (ViewState.ContainsKey("ID"))
      ViewState["ID"] = value;
      else
      ViewState.Add("ID", value);
      }
      get
      {
      return ViewState.ContainsKey("ID")? (int?)ViewState["ID"] : null;
      }
      }

      А иначе при первой же записи/чтении вылетит эксепшн.
      Ответить
      • это почему это он вылетит?
        если ViewState["ID"] == null, то он кастится к (int?), который тоже может быть null
        Ответить
        • Дело в том что ViewStat массив пар Key Value, и в оригинальном коде добавление ключа "ID" происходило при первом присваивании...Поэтому нужно отслеживать его наличие...
          Ответить
          • В get Ваш вариант более рациональный. Если ключа в коллекции не будет то вернется null, а эксепшена не будет
            Ответить
          • я знаю, как хранятся данные во ViewState, но не могу уловить, зачем нужно отслеживать то, что такой ключ уже есть. ведь если он есть, за значение заменится, если нет, то добавится
            ViewState["id"] = 1;
            var t = ViewState["id"];
            ViewState["id"] = 2;
            t = ViewState["id"];
            вот небольшой пример. никаких эксепшенов и вообще все ожидаемо и логично.
            Ответить
          • даже вот нашел в msdn
            public string NavigateUrl
            {
            get
            {
            string text = (string) ViewState["NavigateUrl"];
            if (text != null)
            return text;
            else
            return string.Empty;
            }
            set
            {
            ViewState["NavigateUrl"] = value;
            }
            }
            http://msdn.microsoft.com/en-us/library/ms972976.aspx
            как видим, геттер проверяет на null и возвращает пустую строку, если вдруг, а вот сеттер просто устанавливает значение
            Ответить
            • мда...вот так это код и получается....приношу свои извинения...не прав!
              Ответить
              • да ничего страшного. я за справедливость :о)
                долгое время тоже писал не очень оптимально, теперь сокращаю код и убираю лишние проверки
                Ответить

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