增加了操作符重载来比较两个不同的对象.现在可以'

本文关键字:对象 两个 重载 操作符 比较 增加 | 更新日期: 2023-09-27 18:14:57

c#我试图比较两个不同的对象(我只比较相同的子字段)。但我还有另一个地方,这里有对null的支票。现在我有一个问题,它通过比较两个不同的对象,这就出问题了,因为它不期望为空。我试着放一个新的方法来比较对象,但是它不想选择那个

重载操作符==或!=是否首先检查null ?或者是否有某种方法可以将比较快捷化为null?

增加了操作符重载来比较两个不同的对象.现在可以'

是。您应该在重载中检查是否为空。当==过载时,必须超载!=必须超载GetHashCode()Equals()

检查相等操作符是否为空是标准做法。以String为例:

public static bool operator ==(string a, string b)
{
    return string.Equals(a, b);
}
public static bool Equals(string a, string b)
{
    return a == b || (a != null && b != null && string.EqualsHelper(a, b));
}

您不应该重载==,这会导致代码不直观。只要坚持重写Equals(和GetHashCode)

取自重载操作符== vs . Equals() (Samuel Neff的回答)

当你有表达式

x == y

用于比较变量x和y的方法在编译时决定。这是操作符重载。声明x和y时使用的类型用于定义用于比较它们的方法。x和y中的实际类型(即,子类或接口实现)是不相关的。

object x = "hello"; object y = 'h' + "ello"; // ensure it's a different reference
x == y // evaluates to FALSE

和后面的

string x = "hello"; string y = 'h' + "ello"; // ensure it's a different reference
x == y // evaluates to TRUE

这表明用于声明变量x和y的类型用于确定使用哪个方法求值==。

相比之下,Equals是在运行时根据变量x中的实际类型确定的。Equals是Object上的一个虚方法,其他类型可以并且确实可以覆盖它。因此,以下两个例子的结果都为真。
object x = "hello"; object y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // evaluates to TRUE

和后面的

string x = "hello"; string y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // also evaluates to TRUE