Что вы пытаетесь сделать, как правило, происходит, когда у вас есть неизменные объекты и такие, в любом случае, если вы не хотите использовать struct
, вы можете сделать это следующим образом:
public class Coord : IEquatable<Coord>
{
public Coord(int x, int y)
{
this.X = x;
this.Y = y;
}
public int X { get; }
public int Y { get; }
public override int GetHashCode()
{
object.Equals("a", "b");
// Just pick numbers that are prime between them
int hash = 17;
hash = hash * 23 + this.X.GetHashCode();
hash = hash * 23 + this.Y.GetHashCode();
return hash;
}
public override bool Equals(object obj)
{
var casted = obj as Coord;
if (object.ReferenceEquals(this, casted))
{
return true;
}
return this.Equals(casted);
}
public static bool operator !=(Coord first, Coord second)
{
return !(first == second);
}
public static bool operator ==(Coord first, Coord second)
{
if (object.ReferenceEquals(second, null))
{
if (object.ReferenceEquals(first, null))
{
return true;
}
return false;
}
return first.Equals(second);
}
public bool Equals(Coord other)
{
if (object.ReferenceEquals(other, null))
{
return false;
}
return object.ReferenceEquals(this, other) || (this.X.Equals(other.X) && this.Y.Equals(other.Y));
}
}
Примечание. Вы действительно должны сделать ваш класс неизменным, если вы выполняете обычное равенство, так как он может сломать ваш код, если вы используете коллекцию, основанную на хэше.
Я считаю, что хорошей практикой является выполнение всех этих перегрузок, когда вы хотите, чтобы вы выполняли обычную проверку равенства. Тем более, что, когда object.GetHashCode()
возвращает одно и то же значение для двух объектов, Dictionary
и другие коллекции, основанные на хеше, используют оператор равенства по умолчанию, который использует object.Equals
.
Object.ReferenceEquals(Ob,Ob)
определить ссылочное равенство, a.k.a, если обе контрольные точки относятся к одному и тому же распределенному значению, причем две ссылки равны, гарантируя, что это тот же самый объект.
Object.Equals(Ob)
является виртуальным методом в object
классе, по умолчанию он сравнивает ссылки так же, как Object.ReferenceEquals(Ob,Ob)
Object.Equals(Ob,Ob)
называет Ob.Equals(Ob)
, так что да, проверяя только статическая стенографию для нуля заранее IIRC.
Вы не задать вопрос. Вы хотите, чтобы мы объяснили разницу между различными методами в вашем последнем предложении? – Amy
Итак, какие проблемы у вас были, переопределяя эти два метода? – Servy
Возможно, вы можете посмотреть здесь: http://stackoverflow.com/questions/3103308/overridding-equals-and-gethash?rq=1 –