cla*_*amp 15 c# java operators equals-operator
在c#中,当你在两个对象上与"=="运算符进行比较时,后台究竟发生了什么?它只是比较地址?或者像Equals()或CompareTo()这样的东西?
PS:java中的"=="运算符怎么样?它的行为是否相同?
Ste*_*ger 24
我所知道的:
Equals在object中实现,也可以被覆盖.Object中的默认实现执行引用类型的引用比较.所以默认情况下,Equals和==也是这样.
我认为在java中你不能重载==运算符.但我的Java知识已经过时了.
编辑:
请注意,==运算符是静态方法.它在编译时绑定,基于变量或字段的类型.Equals是基于实际运行时类型在运行时找到的虚方法.
作为Stefan优秀答案的延伸- 另一个例外是操作数涉及Nullable<T>- 在这种情况下"解除"操作符适用(ECMA 334v4中的14.2.7):
对于相等运算符==!=
如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升形式的运算符.提升形式是通过添加一个?每个操作数类型的修饰符.提升的运算符认为两个空值相等,并且空值不等于任何非空值.如果两个操作数都为非null,则提升的运算符将解包操作数并应用基础运算符以生成bool结果.
这意味着:因为(例如)之间有一个相等运算符:
int i = ..., j = ...;
bool eq = i == j;
Run Code Online (Sandbox Code Playgroud)
因此,有一个表单的隐式运算符(尽管做得不同):
int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
if(j.HasValue) { // both have values; compare
eq = i.GetValueOrDefault() == j.GetValueOrDefault();
} else { // one null; always false
eq = false;
}
} else { // true if both null, else false
eq = !j.HasValue;
}
Run Code Online (Sandbox Code Playgroud)