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

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

是吗?

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运算符?

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

 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 ,我通常会这样,但不一定总是这样。

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

7.9.6引用类型相等运算符

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

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

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

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

[更多细节跳过…]

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

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