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

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

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

我所知道的:

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

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

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

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

作为Stefan优秀答案的延伸 – 另一个例外是如果操作数涉及Nullable – 在这种情况下“提升”运算符适用(ECMA 334v4中的14.2.7):

对于相等运算符==!=

如果操作数类型都是非可空值类型并且结果类型是bool,则存在提升forms的运算符。 提升forms是通过添加一个? 每个操作数类型的修饰符。 提升的运算符认为两个空值相等,并且空值不等于任何非空值。 如果两个操作数都为非null,则提升的运算符将解包操作数并应用基础运算符以生成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; } 

来自MSDN :

对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true。 对于字符串类型,==比较字符串的值。

否…… ==运算符在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") 

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

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

对于引用类型,如果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)=真