只是想知道我在标题中提到的是一个好习惯.这对我来说很有意义,我们重写GetHashCode以返回一个基于两个属性的值,如果匹配,则应将两个对象视为相等.逻辑似乎很好,代码可以工作,但我不知道它是否会导致其他问题.
这是使用GetHashCode:
public static bool operator ==(CartesianCoordinates a, CartesianCoordinates b)
{
return a.GetHashCode() == b.GetHashCode(); // Using GetHashCode here
}
public static bool operator !=(CartesianCoordinates a, CartesianCoordinates b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return this == (CartesianCoordinates)obj; // This just uses the == override
}
public override int GetHashCode()
{
return (this.X + this.Y.ToLower()).GetHashCode(); // GetHashCode hashes the two properties we care about
}
Run Code Online (Sandbox Code Playgroud)
这就是我以前的方式:
public static bool operator ==(CartesianCoordinates a, CartesianCoordinates b)
{
return a.X == b.X && string.Equals(a.Y, b.Y, StringComparison.CurrentCultureIgnoreCase); // The difference is here
}
public static bool operator !=(CartesianCoordinates a, CartesianCoordinates b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return this == (CartesianCoordinates)obj;
}
public override int GetHashCode()
{
return (this.X + this.Y.ToLower()).GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
重要的提示:
在CartesianCoordinates对象中,X是一个int,Y是一个字符串:
public int X { get; set; }
public string Y { get; set; }
Run Code Online (Sandbox Code Playgroud)
Lmk,提前谢谢!
这样做不仅是不好的做法,也是错的!两个相等的对象必须具有相同的哈希码,但事实恰恰相反:两个不同的对象可以具有相同的哈希码(通常会).因此,如果您使用哈希码来确定对象是否相等,在某些情况下,当它们实际上不同但恰好碰巧具有相同的哈希码时,您会认为它们相等.哈希码不是唯一标识符......
根据您GetHashCode的实现,对象坐标(x, y)和(y, x)将被视为相等(因为x + y == y + x)