我在课程上重载了==运算符,如下所示:
public static bool operator ==(Table pt1, Table pt2) {
return Compare(pt1, pt2) == 0 && pt1.TableName == pt2.TableName;
}
比较将像strcmp在c ++中一样工作,返回一个整数。问题是,如果我执行if(MY_CLASS == null),它将调用我的==运算符,从而调用我的Compare函数。什么是alternatiev?检查pt1和pt2以查看它们是否为空?或者只是在pt2?
答案 0 :(得分:12)
您应该检查Microsoft的guidelines以实现'=='运算符以及覆盖'Equals()'。
根据他们的例子改编你想要的东西:
public static bool operator ==(Table a, Table b)
{
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
// If one is null, but not both, return false.
if (((object)a == null) || ((object)b == null))
{
return false;
}
// Return true if the fields match:
return Compare(a, b) == 0 && a.TableName == b.TableName;
}
答案 1 :(得分:3)
您将需要空检查才能获得正确的行为。在我看来,添加此检查的最明确方法是调用object.ReferenceEquals(x, null)
,因为它是一个直接的非多态方法调用,并且可能相当有效。
答案 2 :(得分:2)
只需将此行添加到您的运营商:
if ((object)pt1 == null || (object)pt2 == null) return false;
(object)
强制转型是为了防止递归(来自object.==
而不是MY_CLASS.==
。
虽然我不确定将null与null比较时应该出现的条件。
答案 3 :(得分:2)
我问了一个类似的问题here。看看吧。
public bool Equals(ClauseBE other)
{
if (this._id == other._id)
{
return true;
}
return false;
}
public override bool Equals(Object obj)
{
if (obj == null)
{
return base.Equals(obj);
}
if (!(obj is ClauseBE))
{
throw new InvalidCastException("The 'obj' argument is not a ClauseBE object.");
}
return Equals(obj as ClauseBE);
}
public override int GetHashCode()
{
return this._id.GetHashCode();
}
public static bool operator ==(ClauseBE a, ClauseBE b)
{
if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
{
return true;
}
if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
{
return false;
}
return a.Equals(b);
}
public static bool operator !=(ClauseBE a, ClauseBE b)
{
return !(a == b);
}