RCI*_*CIX 71 .net c# struct operators equals-operator
正如标题所说:我是否需要覆盖==运营商?怎么样的.Equals()方法?我缺少什么?
UpT*_*eek 85
msdn的一个例子
public struct Complex
{
double re, im;
public override bool Equals(Object obj)
{
return obj is Complex && this == (Complex)obj;
}
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
public static bool operator ==(Complex x, Complex y)
{
return x.re == y.re && x.im == y.im;
}
public static bool operator !=(Complex x, Complex y)
{
return !(x == y);
}
}
Run Code Online (Sandbox Code Playgroud)
Dzm*_*uba 44
您还应该实现IEquatable <T>.以下是框架设计指南的摘录:
在值类型上实现IEquatable.值类型的Object.Equals方法导致装箱,其默认实现效率不高,因为它使用了反射.IEquatable.Equals可以提供更好的性能,并且可以实现,以便它不会导致装箱.
public struct Int32 : IEquatable<Int32> {
public bool Equals(Int32 other){ ... }
}
Run Code Online (Sandbox Code Playgroud)
在实现IEquatable.Equals时,请遵循与覆盖Object.Equals相同的指导原则.有关重写Object.Equals的详细指南,请参见第8.7.1节
Ajk*_*Ajk 14
不幸的是,我没有足够的声誉评论其他参赛作品.所以我在这里发布了对顶级解决方案的可能增强.
纠正我,如果我错了,但上面提到的实施
public struct Complex
{
double re, im;
public override bool Equals(Object obj)
{
return obj is Complex && this == (Complex)obj;
}
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
public static bool operator ==(Complex x, Complex y)
{
return x.re == y.re && x.im == y.im;
}
public static bool operator !=(Complex x, Complex y)
{
return !(x == y);
}
}
Run Code Online (Sandbox Code Playgroud)
有重大缺陷.我指的是
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
XORing是对称的,因此Complex(2,1)和Complex(1,2)会给出相同的hashCode.
我们应该做更像的事情:
public override int GetHashCode()
{
return re.GetHashCode() * 17 ^ im.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
大多数情况下,您可以避免在结构中实现Equals和GetHashcode - 因为编译器会使用按位内容+反射为参考成员自动实现Value类型.
看看那篇文章: 哪个最适合数据存储结构/类?
因此,为了便于使用,您仍然可以实现==和!=.
但大多数情况下,您可以避免实现Equals和GetHashcode.
您必须实现Equals和GetHashCode的情况适用于您不想考虑的字段.
例如,一个随时间变化的字段,如人的年龄或汽车的instantSpeed(如果你想在同一个地方的字典中找到它,对象的身份不应该改变)
问候,最好的代码