2009-04-30 52 views
15

in c#当你与两个对象上的“==”运算符进行比较时,背景中究竟发生了什么?它只是比较地址?或者像Equals()或CompareTo()那样?C#==运算符详细说明了什么?

PS:那么Java中的“==”运算符呢?它的行为是否一样?

+0

只是一个快速的信息:如果你重载==,还必须实现!=。 <= and > =也是如此。 – Tarik 2010-04-08 03:03:34

回答

24

据我知道:

  • 它值类型由值(平等)
  • 它通过引用的引用类型进行比较(同一性)
  • 除非==操作过载,然后比较它称之为那个。

等于在对象中实现,也可以被覆盖。 Object中的默认实现为参考类型执行参考比较。所以默认情况下,Equals和==也是这样。

我想在java中你不能重载==操作符。但是我的Java知识很不合时宜。

编辑: 注意,==运营商是一个静态方法。它在编译时根据变量或字段的类型进行绑定。 Equals是基于实际运行时类型在运行时找到的虚拟方法。

+3

优秀的答案;至少有一个遗漏,虽然:http://stackoverflow.com/questions/806020/snip/806068#806068 – 2009-04-30 09:19:42

+0

你不能覆盖==运算符在java中,对于java中的引用类型==将始终做一个引用(标识)比较。 – 2009-04-30 09:23:30

4

From MSDN

对于预定义的值的类型,如果 的操作数的值相等的 等号(==)返回true, 否则为假。对于字符串以外的参考类型 ,==返回true,如果 其两个操作数指向相同的 对象。对于字符串类型,== 比较字符串的值。

3

否... ==运算符在java和c#中并不总是表现相同。

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

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

不会返回在Java真的...

在C#相比之下,==操作者的行为对字符串不同。例如,它会在以下情况下返回true:

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

进行了扩展,Stefan's excellent answer - 另一个例外是,如果操作数涉及Nullable<T> - 在这种情况下,“解禁”运营商应用(14.2。7在ECMA 334v4):

对于相等运算 == =

操作者的提升形式存在如果操作数的类型是既 非空值类型,并且如果 结果类型!是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; 
} 
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 == str_b = True 
str_a.Equals(str_b) = True 
obj_a == obj_b = False 
obj_a.Equals(obj_b) = True