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

EOG*_*EOG 19 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

你不能覆盖相等的运算符,但你可以像字符串那样重载它们.你是否应该是另一回事.我想如果我压倒一切,我通常会这样Equals,但不一定总是.

  • Eric Lippert的[邪恶的例子](http://blogs.msdn.com/b/ericlippert/archive/2009/09/28/string-interning-and-string-empty.aspx):`object obj =""; string str2 = String.Empty; Console.WriteLine(obj == str2); //有时是真的,有时是假的 (10认同)
  • 虽然这个例子是正确的,但解释是错误的。最初的问题与多态性、重载或重写无关。== 的默认实现调用 ReferenceEquals() 而不是 Equals()。 (2认同)

Hei*_*nzi 7

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) ".这意味着两个引用都必须指向同一个对象(引用相等).