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

时间:2009-04-30 09:03:45

标签: c# java operators equals-operator

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

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

6 个答案:

答案 0 :(得分:24)

据我所知:

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

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

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

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

答案 1 :(得分:9)

作为Stefan's excellent answer的扩展 - 另一个例外是操作数涉及Nullable<T> - 在这种情况下“提升”运算符适用(ECMA 334v4中的14.2.7):

  

对于相等运算符   ==!=

     

如果操作数类型都是,则存在提升形式的运算符   不可为空的值类型,如果是   结果类型是bool。提升的形式   是通过添加一个?   每个操作数类型的修饰符。该   提升算子认为两个为空   值相等,空值不相等   任何非空值。如果两者   操作数是非空的,解除了   操作员解开操作数和   将基础运算符应用于   产生博尔的结果。

这意味着:因为(例如)之间存在一个相等运算符:

int i = ..., j = ...;
bool eq = i == j;

因此,表单中有一个隐式运算符(尽管做的不同):

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

答案 2 :(得分:4)

From MSDN

  

对于预定义的值类型,   如果,则等于运算符(==)返回true   其操作数的值相等,   否则是假的。适用于参考类型   除了string之外,==如果返回true则返回true   它的两个操作数指的是相同的   宾语。对于字符串类型,==   比较字符串的值。

答案 3 :(得分:3)

否...... ==运算符在java和c#中的行为并不总是相同。

例如使用Strings; Java ==会比较字符串对象的引用...(如果使用primitve类型,则在java中使用==比较值)。这就是为什么

// returns FALSE in JAVA
(new String("test") == "test") 

在java中不会返回true ...

相反,在C#中,==运算符在字符串上的行为不同。例如,在以下情况下它将返回true:

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 

答案 4 :(得分:1)

答案 5 :(得分:0)

==运算符的行为取决于你应用它的变量是如何声明的(不是在对象的类上,我将添加一个例子)。

对于值类型,它将比较它们的值。

对于引用类型,如果a与b是同一个对象,则a == b将返回true,除非==运算符被重载。没有像其他人所说的那样被覆盖,你不能覆盖c#中的运算符,因为它们不是虚拟的。

object obj_a, obj_b; string str_a, str_b;

        str_a = "ABC";
        str_b = new string("ABC".ToCharArray());
        obj_a = str_a;
        obj_b = str_b;

        Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
        Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
        Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
        Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
        Console.ReadKey();

str_a = "ABC"; str_b = new string("ABC".ToCharArray()); obj_a = str_a; obj_b = str_b; Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed. Console.ReadKey();

该程序的输出是

str_a == str_b = True
str_a.Equals(str_b) = True
obj_a == obj_b = False
obj_a.Equals(obj_b) = True