C#==运算符详细说明了什么?

cla*_*amp 15 c# java operators equals-operator

在c#中,当你在两个对象上与"=="运算符进行比较时,后台究竟发生了什么?它只是比较地址?或者像Equals()或CompareTo()这样的东西?

PS:java中的"=="运算符怎么样?它的行为是否相同?

Ste*_*ger 24

我所知道的:

  • 它按值比较值类型(相等)
  • 它通过引用比较引用类型(标识)
  • 除非==运算符被重载,否则它会调用那个.

Equals在object中实现,也可以被覆盖.Object中的默认实现执行引用类型的引用比较.所以默认情况下,Equals和==也是这样.

我认为在java中你不能重载==运算符.但我的Java知识已经过时了.

编辑: 请注意,==运算符是静态方法.它在编译时绑定,基于变量或字段的类型.Equals是基于实际运行时类型在运行时找到的虚方法.

  • 优秀答案; 但至少有一个遗漏:http://stackoverflow.com/questions/806020/snip/806068#806068 (3认同)

Mar*_*ell 9

作为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)