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

    −7

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    int CompareTo (A a1, A a2)
    {
       if (a1.Year>a2.Year) return 1;
       if (a1.Year<a2.Year) return -1;
        return 0;
    }

    реализация интерфейса IComparable, чем не понравилось стандартное норминрование: return a1.Year - a2.Year; так и не понял

    Запостил: guest, 28 Декабря 2008

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

    • Alexander G:
      [quote=Аффтар]чем не понравилось стандартное норминрование: return a1.Year - a2.Year; так и не понял[/quote]
      Не знаю, возможно ли это в С#, но в С++ может быть в качестве A тип большего размера, т.е. допустим int 4 байта, а в качестве A - 8байтный long, тогда разность может не скастится до инта корректно, и результат будет неправильным, а сравнение корректно всегда.
      Ответить
    • Serg:
      Вероятно вы имели в виду a1, a2

      В C# можно передать в этот метод либо экзмепляр самого класса, либо его наследник. В любом случае, среда гарантирует, что код будет работать корректно и для потомков. Сама логика интерфейса подразумевает сравнение объектов одного типа, и не зависит от языка, так что я бы сказал, что передавать разноразмерные параметры в эту функцию - семантически сомнительно.

      ЗЫ Среда же не допустит неявного (и явного) преобразования long к int и возникнет ошибка времени компиляции.
      Ответить
    • Alexander G:
      Я имел в виду что A::year - это long или uint который не приводится к int без потерь. Да, уже посмотрел, что подобные неявные преобразования в шарпе запрещены - только через явный каст.

      В С++ мне приходилось в подобном случае, когда return(a1-a2); было некорректно, но компилилось, заменять вычитание на приведенный код, поэтому возможно автор кода опытный С/С++ разработчик.
      Ответить
    • [email protected]:
      int CompareTo(A a1, A a2)
      {
      return Comparer<int>.Default.Compare(a1.Year, a2.Year); // Для случая, когда Year - int
      }
      Ответить
    • нормальный код, чо прицепился
      Ответить
    • Bobby:
      Не говнокод
      Ответить
    • Виталий:
      Вот вырезка из исходников класса Int32.
      Код абсолютно нормальный.
      При сравнении (a - b) могут быть ошибки в случае, когда a=maxint, b=-maxint.

      // Compares this object to another object, returning an integer that 
              // indicates the relationship. 
              // Returns a value less than zero if this  object
              // null is considered to be less than any instance. 
              // If object is not of type Int32, this method throws an ArgumentException.
              //
              public int CompareTo(Object value) {
                  if (value == null) { 
                      return 1;
                  } 
                  if (value is Int32) { 
                      // Need to use compare because subtraction will wrap
                      // to positive for very large neg numbers, etc. 
                      int i = (int)value;
                      if (m_value < i) return -1;
                      if (m_value > i) return 1;
                      return 0; 
                  }
                  throw new ArgumentException (Environment.GetResourceString("Arg_MustBeInt32")); 
              } 
      
              public int CompareTo(int value) { 
                  // Need to use compare because subtraction will wrap
                  // to positive for very large neg numbers, etc.
                  if (m_value < value) return -1;
                  if (m_value > value) return 1; 
                  return 0;
              }
      Ответить
    • Anon:
      Если обсуждается сравнение объектов одного типа вне своего класса, то да, это быдлокод, если обсуждается индусское сравнение даты вместо имплементного IComparable<DateTime/int>, то тоже быдлокод. Сдаётся мне тут же толпа быдлокодеров долбится об стену головой:
      public class A : IComparable<A>
      {
          public DateTime Year;
      
          public int CompareTo (A other)
          {
              if (other == null)
              {
                  throw new ArgumentNullException ("other");
              }
      
              return this.Year.CompareTo (other.Year);
          }
      }
      Ответить

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