增加了操作符重载来比较两个不同的对象.现在可以'
本文关键字:对象 两个 重载 操作符 比较 增加 | 更新日期: 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