C#:==和!=的默认实现对象的运算符
我想知道等式运算符的默认实现是什么(=和!=) 是吗C#:==和!=的默认实现对象的运算符,c#,.net,c#-4.0,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操作符?不,不是
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
不能重写相等运算符,但可以像字符串一样重载它们。你是否应该是另一回事。我想如果我重写
等于,我通常会这样做,但不一定总是这样。默认情况下,这些操作符测试引用的相等性。第7.9节介绍了内置=
操作符的确切行为。例如,当对引用类型值使用==
时,以下部分适用:
7.9.6参考类型相等运算符
预定义的引用类型相等运算符包括:
bool操作符==(对象x,对象y)代码>
bool操作符=(对象x、对象y)代码>
运算符返回比较两个引用是否相等的结果
由于预定义的引用类型相等运算符接受object类型的操作数,因此它们适用于未声明适用运算符==和运算符!=的所有类型成员。相反,任何适用的用户定义相等运算符都会有效地隐藏预定义的引用类型相等运算符
[跳过更多详细信息…]
请注意,“比较两个引用是否相等”并不意味着“调用obj1.Equals(obj2)
”的结果。这意味着两个引用必须指向同一个对象(引用相等)。我认为您应该搜索,因为讨论了很多类似的主题,所以浏览其中的一些主题,您将清楚地了解thisEric Lippert的:object obj=“”;string str2=string.Empty;Console.WriteLine(obj==str2);//有时是对的,有时是错的
这是一个非常好的答案,并解释了很多其他问题。这就是它与Equal()
方法的不同之处Equal
方法是一种virtual
方法,因此x.Equals(y)
将返回true
,因为它将在运行时被绑定,并且该方法的运行时等价物是string
sEqual
方法。但是不能重写=
,只能重载
,并且将在编译时确定调用哪个运算符,并且将使用参数类型确定绑定到哪个重载。谢谢@JonSkeet。虽然这个例子是正确的,但解释是错误的。最初的问题与多态性、重载或重写无关。==的默认实现调用ReferenceEquals()not Equals()。@Trade-IdeasPhilip:当原始问题询问“所以我只需要重写Equals方法”时,它以什么方式与重写无关?不,==
不调用ReferenceEquals
-相反。他问的是默认实现。。。obj1.等于(obj2)。。。?答案是否定的,默认实现是。。。obj1.ReferenceEquals(obj2)。。。或者类似的东西。这就是为什么覆盖Equals()是不够的。值得注意的是,=
和引用相等的现有规范存在问题。这是一个非常棘手的问题要解决-我们希望我们已经在ECMA规范的下一个版本中解决了它。@JonSkeet:听起来很有趣。你有详细资料的链接吗?恐怕没有。所有的讨论都是私下的,至少目前是这样。(很多事情都是亲自发生的。)隐式转换最终会出现问题,IIRC。。。