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

    +126.6

    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
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    private OperatingSystem(SerializationInfo info, StreamingContext context)
    {
        SerializationInfoEnumerator enumerator = info.GetEnumerator();
        while (enumerator.MoveNext())
        {
            string name = enumerator.Name;
            if (name != null)
            {
                if (!(name == "_version"))
                {
                    if (name == "_platform")
                    {
                        goto Label_0067;
                    }
                    if (name == "_servicePack")
                    {
                        goto Label_0089;
                    }
                }
                else
                {
                    this._version = (Version) info.GetValue("_version", typeof(Version));
                }
            }
            continue;
        Label_0067:
            this._platform = (PlatformID) info.GetValue("_platform", typeof(PlatformID));
            continue;
        Label_0089:
            this._servicePack = info.GetString("_servicePack");
        }
        if (this._version == null)
        {
            throw new SerializationException(Environment.GetResourceString("Serialization_MissField", new object[] { "_version" }));
        }
    }

    Это добыто из недр .NET Framework с помощью рефлектора..)

    Запостил: eee_qqq, 07 Декабря 2009

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

    • таки а в чем соль?
      Ответить
      • Таки нахрен тут goto и continue, когда можно просто:
        while (enumerator.MoveNext())
        {
        string name = enumerator.Name;
        if (name != null)
        {
        if (!(name == "_version"))
        {
        if (name == "_platform")
        {
        this._platform = (PlatformID)info.GetValue("_platform", typeof(PlatformID));
        }
        if (name == "_servicePack")
        {
        this._servicePack = info.GetString("_servicePack");
        }
        }
        else
        {
        this._version = (Version)info.GetValue("_version", typeof(Version));
        }
        }
        }
        Ответить
        • настолько забыл о существовании goto что просто перестал его замечать :) мой косяк, проглядел
          Ответить
        • Этот "говнокод" писал не человек, а рефлектор. Скорее всего человек-то примерно так и написал, как у тебя. Только ты забыл else в одном месте.
          Ответить
          • Знаю про else, я старался акцентировать внимание на другом
            Ответить
          • Иногда reflector вот так видит сонструкции switch.
            Ответить
    • рефлектор не всегда возвращает то, что было до компиляции, поскольку он строит С# код из IL, содержащегося в сборке, и ему пофик на красоту кода)
      Ответить
      • С этим согласен, но чтобы ТАК извратить код, как то слабо верится...
        Ответить
        • А вы попробуйте скомпилить ваш код в сборку и поглядеть рефлектором.
          Ответить
    • Реальный код из OperatingSystem.cs:
      private OperatingSystem(SerializationInfo info, StreamingContext context) { 
                  SerializationInfoEnumerator enumerator = info.GetEnumerator(); 
                  while( enumerator.MoveNext()) {
                      switch( enumerator.Name) { 
                          case "_version":
                              _version = (Version) info.GetValue("_version", typeof(Version));
                              break;
                          case "_platform": 
                              _platform = (PlatformID) info.GetValue("_platform", typeof(PlatformID));
                              break; 
                          case "_servicePack": 
                              _servicePack = info.GetString("_servicePack");
                              break; 
                      }
                  }
      
                  if (_version == null ) { 
                      throw new SerializationException(Environment.GetResourceString("Serialization_MissField", "_version"));
                  } 
              }
      Ответить

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