所以我有一个类覆盖Equals(object obj)和GetHashCode()以及实现IEquatable。为了使这种类型的工作在检查相等性时更自然,我想,哎呀,我会重载等式运算符和不等式运算符,不用担心......
哦,担心......考虑以下内容 - 两个myType实例都不为空:
if (myType != container.myType) //NullReferenceException
{
//never get here
}
//never get here either
现在,容器只是另一个用来保存myType实例的类,用于缓存项目。
以下是myType的实际(相关)代码:
public class MyType : IEquatable<MyType>
{
public static bool operator ==(MyType myTypeA, MyType myTypeB)
{
return myTypeA.Equals(myTypeB);
}
public static bool operator !=(MyType myTypeA, MyType myTypeB)
{
return !(myTypeA == myTypeB);
}
public override bool Equals(object obj)
{
if (obj != null && obj is MyType)
{
return Equals((MyType)obj);
}
return false;
}
public bool Equals(MyType other)
{
if (other != null)
{
return other.ToString() == ToString();
}
return false;
}
}
这方面有什么经验吗?
感谢。
答案 0 :(得分:3)
指点几点 -
==
和!=
,请务必使用ReferenceEquals
检查重载实现中的null,而不是==
,因为调用你的重载运算符,或者进入循环或尝试在空Equals
引用上调用this
,这可能就是这里发生的事情。==
和!=
。这些运算符用于值相等,而类实际上并不是为了实现价值相等。删除运算符重载,或使MyType
成为结构。答案 1 :(得分:2)
棘手的问题是你在Equal覆盖中使用等于运算符,如下所示:
public bool Equals(MyType other)
{
if (other != null)
它转到你的重载!=运算符,它依次转到你的==运算符,它试图做null.Equals ......
答案 2 :(得分:1)
正如其他人所说,你需要小心检查空值,因为它会再次调用你的相等函数,通常会导致StackOverflowException。
当我在类上使用IEquatable
接口时,我通常使用以下代码:
public override bool Equals(object obj)
{
// If obj isn't MyType then 'as' will pass in null
return this.Equals(obj as MyType);
}
public bool Equals(MyType other)
{
if (object.ReferenceEquals(other, null))
{
return false;
}
// Actual comparison code here
return other.ToString() == this.ToString();
}