C#:对象的==和!=运算符的默认实现

时间:2011-09-08 09:36:10

标签: c# .net c#-4.0

我想知道什么是相等操作的默认实现(==和!=)

是吗?

public static bool operator ==(object obj1, object obj2)
{
    return obj1.Equals(obj2);
}
public static bool operator !=(object obj1, object obj2)
{
    return !obj1.Equals(obj2);
}

所以我只需要覆盖Equals方法,或者我是否还需要覆盖euality运算符?

3 个答案:

答案 0 :(得分:27)

不, - 默认情况下,检查引用是否相等。诸如==之类的运算符多态,默认情况下调用任何多态。例如:

string x = "Hello";
string y = new String("Hello".ToCharArray());
Console.WriteLine(x == y); // True; uses overloaded operator

object a = x;
object b = y;
Console.WriteLine(a == b); // False; uses default implementation

你不能覆盖等于运算符,但你可以像字符串一样重载它们。你是否是另一回事。如果我覆盖Equals,我认为通常会,但不一定总是如此。

答案 1 :(得分:6)

C# language specification,第7.9节介绍了内置==运算符的确切行为。例如,在引用类型值上使用==时,以下部分适用:

  

7.9.6参考类型相等运算符

     

预定义的引用类型相等运算符是:

     

bool operator ==(object x, object y);
  bool operator !=(object x, object y);

     

运算符返回比较两个引用的结果是否相等或不相等。

     

由于预定义的引用类型相等运算符接受object类型的操作数,因此它们适用于所有未声明适用的operator ==和operator!= members的类型。相反,任何适用的用户定义的相等运算符都会有效地隐藏预定义的引用类型相等运算符。

     

[跳过更多细节...]

请注意,“比较两个引用是否相等”并不意味着“调用obj1.Equals(obj2) ”的结果。这意味着两个引用都必须指向同一个对象(引用相等)。

答案 2 :(得分:3)

默认情况下,这些运算符会测试引用的相等性。