Какой метод .Equals() использовать

В этом вопросе. мы обнаружили, что в .NET 1.1 Array.IndexOf(array, value) искал элемент с

value.Equals(arrayElement) == true

в то время как .NET 2.0 изменил его для поиска элемента с

arrayElement.Equals(value) == true

Очевидно, что потенциальная разница между двумя результатами возникает из-за полиморфизма, но есть ли причина, по которой последняя версия предпочтительнее? В более общем смысле, если у меня есть два объекта a и b для сравнения, есть ли веская причина предпочесть a.Equals(b) или b.Equals(a)?


person stevemegson    schedule 28.08.2009    source источник
comment
Хотя я согласен с вами, @recursive в этом контексте подчеркивает суть фрагмента кода.   -  person Austin Salonen    schedule 28.08.2009
comment
Я бы не стал писать if ( value.Equals(arrayElement) == true ), но, как говорит Остин, ударение в данном случае показалось полезным.   -  person stevemegson    schedule 28.08.2009


Ответы (2)


Я предполагаю, что это сделано, чтобы избежать проблем, когда вы переопределяете Equals в объекте, который вы загружаете в IndexOf. Другими словами, если у вас есть class Foo с какой-то странной реализацией Equals, это:

Foo f = new Foo();
Bar b = arrayOfDateTimes.IndexOf(f);

потенциально может нарушить поведение и привести к странным результатам.

person Anton Gogolev    schedule 28.08.2009
comment
Но разве не столь же вероятно, что у вас есть странное переопределение Equals для объекта, хранящегося в массиве? Они кажутся одинаково рискованными, но, поскольку это потенциально критическое изменение, кажется, что у MS должна была быть причина для изменения. - person stevemegson; 28.08.2009

Просто предположение, но версия 1.1 могла иметь более высокий уровень NullReferenceExceptions по сравнению с версией 2.0.

person Austin Salonen    schedule 28.08.2009