C# == 操作符具体做了啥?

Posted

技术标签:

【中文标题】C# == 操作符具体做了啥?【英文标题】:C# what does the == operator do in detail?C# == 操作符具体做了什么? 【发布时间】:2010-10-22 19:18:30 【问题描述】:

在 c# 中,当您在两个对象上使用“==”运算符进行比较时,后台究竟会发生什么?它只是比较地址吗?还是类似于 Equals() 或 CompareTo() ?

PS:Java 中的“==”运算符呢?它的行为是否相同?

【问题讨论】:

只是一个简单的信息:如果你重载 ==,你还必须实现 !=。 = 也是如此。 【参考方案1】:

据我所知:

它按值(相等)比较值类型 它按引用(身份)比较引用类型 除非 == 运算符重载,否则它会调用那个运算符。

Equals 在对象中实现,也可以被覆盖。 Object 中的默认实现对引用类型执行引用比较。所以默认情况下,Equals 和 == 做同样的事情。

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

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

【讨论】:

优秀的答案;不过至少有一处遗漏:***.com/questions/806020/snip/806068#806068 你不能在java中覆盖==操作符,因为java中的引用类型==总是会做一个引用(身份)比较。 您不能在 C# 中覆盖运算符,因为它们不是虚拟的。你只能超载它们。 @Michal:谢谢,你显然是对的,运营商甚至是静态的。我修正了条款。【参考方案2】:

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

对于等式运算符 == !=

如果操作数类型都是 不可为空的值类型,如果 结果类型为布尔型。提升的形式 是通过添加单个 ? 每个操作数类型的修饰符。这 提升运算符认为两个 null 值相等,空值不相等 到任何非空值。如果两者 操作数非空,提升 运算符展开操作数和 将基础运算符应用于 产生布尔结果。

这意味着:因为(比方说)之间有一个相等运算符:

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;

【讨论】:

【参考方案3】:

From MSDN:

对于预定义的值类型, 等式运算符 (==) 在以下情况下返回 true 其操作数的值相等, 否则为假。对于引用类型 除了字符串,== 如果返回 true 它的两个操作数指的是同一个 目的。对于字符串类型,== 比较字符串的值。

【讨论】:

【参考方案4】:

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

例如使用字符串; Java == 确实比较了字符串对象的引用...(如果您使用原始类型,则 == 在 java 中比较值)。这就是为什么

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

在 java 中不会返回 true...

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

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

【讨论】:

这是因为 == 运算符不能在 Java 中被覆盖,但在 C# 中,字符串就是这样。这会使操作员的行为不同吗? 当你习惯用 C# 编写软件然后在另一个项目中使用 Java 时,我认为这是一个常见的陷阱......这就是我想指出的原因【参考方案5】:

它的作用取决于上下文。

http://en.csharp-online.net/ECMA-334:_14.9_Relational_and_type-testing_operators

【讨论】:

【参考方案6】:

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

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

对于引用类型,如果 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 = 真 str_a.Equals(str_b) = True obj_a == obj_b = 假 obj_a.Equals(obj_b) = True

【讨论】:

以上是关于C# == 操作符具体做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Keras Tokenizer 方法究竟做了啥?

new关键字具体做了啥?

mvn install in maven 到底做了啥

FORCE 在信用卡交易中做了啥?

cuda 究竟为 opengl 应用程序做了啥?

打开新标签时,谷歌浏览器究竟做了啥?