Си диез / Говнокод #296 Ссылка на оригинал

0

  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 guest, (Updated )

Комментарии (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); было некорректно, но компилилось, заменять вычитание на приведенный код, поэтому возможно автор кода опытный С/С++ разработчик.
    Ответить
  • Lamer@fools.ua:
    int CompareTo(A a1, A a2)
    {
    return Comparer<int>.Default.Compare(a1.Year, a2.Year); // Для случая, когда Year - int
    }
    Ответить
  • Виталий:
    Вот вырезка из исходников класса 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);
        }
    }
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8