C#我正在尝试比较两个不同的对象(我只是比较相同的子字段)。但我还有另一个地方可以检查null。现在我遇到了一个问题,它比较了两个不同的对象,并且因为它不期望为空而爆炸。我试图将一个新方法与对象进行比较,但它不想选择那个。
重载运算符==或!=首先检查是否为null是标准做法吗?或者是否有某种方法可以将比较缩短为null?
答案 0 :(得分:3)
是。您应该在重载中检查null。如果你重载==
,必须重载!=
, GetHashCode()
和Equals()
。
答案 1 :(得分:2)
在等式运算符中检查null是标准做法。以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));
}
答案 2 :(得分:1)
你不应该重载==它会导致代码不直观。坚持覆盖Equals(和GetHashCode)
取自Overloading operator== versus 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