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

本文关键字:实现 对象 默认 运算符 | 更新日期: 2023-09-27 18:07:53

我想知道等式运算符(==and!=(的默认实现是什么

是吗?

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

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

否,检查引用是否相等不是。像==这样的操作符是而不是多态的,并且默认情况下不会调用任何多态的东西。例如:

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);

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

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

[跳过更多详细信息…]

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

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