添加了运算符重载以比较两个不同的对象。现在无法检查null

时间:2011-11-17 23:36:04

标签: c# operator-overloading nullreferenceexception

C#我正在尝试比较两个不同的对象(我只是比较相同的子字段)。但我还有另一个地方可以检查null。现在我遇到了一个问题,它比较了两个不同的对象,并且因为它不期望为空而爆炸。我试图将一个新方法与对象进行比较,但它不想选择那个。

重载运算符==或!=首先检查是否为null是标准做法吗?或者是否有某种方法可以将比较缩短为null?

3 个答案:

答案 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