Где разместить логику равенства в перегрузке оператора Equals(Tother) или ==? [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Где разместить логику равенства в перегрузке оператора Equals(Tother) или ==? [закрыто]

Сообщение Anonymous »

Контекст
Тип значения (структура):

При реализации IEquatable для пользовательского значения type (struct), мы склонны писать подход, который я выбрал, увидев некоторые реализации в нескольких моих предыдущих организациях и несколько сообщений в Интернете, фактическую логику равенства в реализации метода Equals(Tother) и для достижения согласованность:
  • переопределить метод Equals(Object? obj) и
  • перегрузки == & != оператор
для внутреннего вызова метода Equals(Tother) для проверки равенства.

Код: Выделить всё

public readonly struct CommandKey : IEquatable
{
public String Key { get; }

public CommandKey(String key)
{
Key = key;
}

//Actual equality logic here
public Boolean Equals(CommandKey other) => String.Equals(Key, other.Key);

//Compatibility with Object.Equals
public override Boolean Equals(Object? obj) => obj is not null && obj is CommandKey other && Equals(other);

//Consistent hash code
public override Int32 GetHashCode() => Key.GetHashCode();

//Operator overloads
public static Boolean operator ==(CommandKey left, CommandKey right) => left.Equals(right);

public static Boolean operator !=(CommandKey left, CommandKey right) => !left.Equals(right);
}
Ссылочный тип (класс):

И аналогично для ссылочного типа (класса): мы склонны напишите логику равенства в перегрузке оператора == и для достижения согласованности:
  • override Equals(Object? obj) метод
  • реализовать IEquatable.Equals(T другой) метод и
  • перегрузить оператор !=
для внутреннего вызова == для проверки равенства.

Код: Выделить всё

public sealed class CommandRequest : IEquatable
{
public CommandKey CommandKey { get; }

//there are other properties as well

public Boolean Equals(CommandRequest? other) => this == other;

public override Boolean Equals(Object? obj) => obj is not null && obj is CommandRequest other && Equals(other);

public static Boolean operator ==(CommandRequest? left, CommandRequest? right)
{
if (ReferenceEquals(left, right))
{
return true;
}

if (left is null || right is null)
{
return false;
}

return
left.CommandKey == right.CommandKey &&
//other properties;
}
public static Boolean operator !=(CommandRequest? left, CommandRequest? right) => !(left == right);
}
Одна из причин заключается в том, что перегрузка оператора == ссылочного типа теперь напрямую содержит всю логику равенства.
Другая причина Я могу подумать, что для ссылочного типа нужно написать логику равенства в перегрузке оператора ==, если один из объектов имеет значение null, скажем, например:

Код: Выделить всё

ClassA a = null;
ClassB b = new ClassB();
a.Equals(b);             //compiles successfully but during runtime, throws System.NullReferenceException
Этот сценарий лучше всего решается с помощью перегрузки оператора ==. Я не знаю других причин, если знаете, укажите их.
Вопрос
Для пользовательских типов значений , какова причина написания фактической логики равенства в реализации метода Equals(Tother), а не в перегрузке оператора ==?Для структуры я могу поместить логику в Equals(T другой) метод IEquatable, а затем вызвать его из других методов и операторов для согласованности.
Для класса, где следует разместить логику проверки равенства (независимо от того, равенство ли это значению или ссылке) и почему?

Подробнее здесь: https://stackoverflow.com/questions/792 ... r-overload
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Зачем писать логику равенства в методе Equals(Tother) интерфейса IEquatable? [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Зачем писать логику равенства в методе Equals(Tother) интерфейса IEquatable? [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Зачем писать логику равенства в методе Equals(Tother) интерфейса IEquatable?
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • PYSAT Как применить Clausify к объекту Equals при использовании объекта Equals в CNF?
    Anonymous » » в форуме Python
    0 Ответы
    45 Просмотры
    Последнее сообщение Anonymous
  • Ошибка матча по каратэ: совпадение не удалось: EQUALS $ | совпадение не удалось: EQUALS
    Anonymous » » в форуме JAVA
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»