2009-10-06 3 views
6

При внедрении оператора == у меня возникает ощущение, что у меня отсутствуют некоторые важные моменты.
Следовательно, я искал некоторые рекомендации по этому поводу.
Вот некоторые вопросы, которые я имею в виду:Каковы наилучшие методы для реализации оператора == для класса в C#?

  • Как чисто обработать ссылочное сравнение?
  • Должен ли он быть реализован через интерфейс IEquatable<T>? Или переопределение object.Equals?
  • А как насчет оператора !=?

(этот список может быть неполным).

+3

Проверьте эти темы: http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c, http://stackoverflow.com/questions/1421289/icomparable-and-equals, http://stackoverflow.com/questions/660566/override-equals-and-gethashcode-question, http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for-custom-types – Groo

ответ

11

Я следовал за Microsoft Guidelines for Overloading Equals() and Operator ==.

редактировать: руководство Microsoft содержат это важное замечание, которое, кажется, подтверждают ответ Henk в:

Переопределение оператора == в без неизменяемых типов не рекомендуется.

3
  • Если вы реализуете ==, переопределить .equals и. GetHashCode
  • агрегате! = А
  • Проверка нулевых ссылок в object.ReferenceEquals иначе оператор рекурсии
+2

Собственно, вы Иметь реализацию! = Также, иначе C# не позволит вам скомпилировать. –

+0

Хорошая точка. Забыл. – dkackman

4

Каждый раз, когда вы реализовать оператор ==, не забудьте также реализовать !=, IEquatable<T> и переопределить Object.Equals() и Object.GetHashCode() для согласованности для пользователя вашего класса.

Учитывая класс, вот моя обычная реализация:

public bool Equals(MyClass other) { 
     if (ReferenceEquals(other, null)) 
      return false; 
     if (ReferenceEquals(other, this)) 
      return true; 
     return // your equality code here 
    } 

    public override bool Equals(object obj) { 
     return Equals(obj as MyClass); 
    } 

    public override int GetHashCode() { 
     return // your hash function here 
    } 

    public static bool operator ==(MyClass left, MyClass right) { 
     return Equals(left, right); 
    } 

    public static bool operator !=(MyClass left, MyClass right) { 
     return !(left == right); 
    } 
+0

Это. Кроме того, если вы сначала реализуете оператор <(меньше), вы можете использовать этот оператор только для реализации каждого другого оператора. ie: == может быть выражен как! (left

4

Наиболее распространенным подходом является не, чтобы справиться с этим. По умолчанию используется сравнение ссылок, которое в общем случае подходит для объектов класса.

Итак, сначала вы хотите быть уверены, что вам нужно поведение типа ценности.

+2

Пусть будет ясный ответ на вопрос, а не совет, говорящий кому-то изменить то, как они поступают. –

0

Использовать Resharper для выполнения таких задач. Нет смысла изобретать колесо.

+1

Это дорогостоящее решение для такой тривиальной задачи. – spender

+1

Кроме того, для некоторых задач, таких как это, я бы предпочел, чтобы разработчик * научился делать что-то должным образом, чем иметь какой-то инструмент для работы с ним, и никогда подумал об этом снова. –

+0

@spender Я уверен, вы знаете, что R # можно использовать не только для таких тривиальных задач. @Mike Они должны иметь возможность написать это вручную, но они также должны иметь инструменты, чтобы быть более продуктивными и не писать. –

Смежные вопросы