У меня есть этот объект:переопределение GetHashCode с различными свойствами
public class Foo {
public string MyOwnId { get; set; }
public Guid FooGuid { get; } = Guid.NewGuid();
}
Я хотел бы Equals()
только заботиться о тех, с MyOwnId
, в противном случае они не никогда равны. Когда у Foo
есть MyOwnId
, я пытаюсь его использовать, в противном случае я хочу использовать FooGuid
.
С FooGuid
вероятно, никогда не будет таким же, я сделал что-то вроде этого:
public bool Equals(Foo foo) {
if (foo== null) return false;
return MyOwnId.Equals(foo.MyOwnId);
}
public override bool Equals(object obj) {
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Foo)obj);
}
public override int GetHashCode() {
int hash = 13;
hash = (hash*7) + (!string.IsNullOrEmpty(MyOwnId) ? MyOwnId.GetHashCode() : FooGuid.GetHashCode());
return hash;
}
Является ли это правильный способ делать то, что я хочу? Или мне также нужно изменить свой метод Equals
, чтобы он выглядел так же, как у моего GetHashCode
? Для например:
public bool Equals(Foo foo) {
if (foo == null) return false;
if (string.IsNullOrEmpty(MyOwnId) || string.IsNullOrEmpty(foo.MyOwnId)) return false;
return MyOwnId.Equals(foo.MyOwnId);
}
Если 'MyOwnId == null', то' return MyOwnId.Equals (foo.MyOwnId); 'будет выдавать * исключение *. Измените его на 'String.Equals (MyOwnId, foo.MyOwnId)' –
@DmitryBychenko Хорошо, но как насчет моего другого примера Equals? Это касается нулевых значений. – MrProgram
Если два экземпляра (например, A и B) равны * в соответствии с 'Equals', они должны * иметь * тот же * хэш-код. Однако 'GetHashCode()' зависит от 'FooGuid' и' Equals' * не *, поэтому правило * нарушено *. –