== vs C#中的等于

Posted

技术标签:

【中文标题】== vs C#中的等于【英文标题】:== vs Equals in C# 【发布时间】:2011-04-21 18:25:07 【问题描述】:

C# 中 == 和 Equals 的求值有什么区别?

例如,

if(x==x++)//Always returns true

但是

if(x.Equals(x++))//Always returns false 

已编辑:

     int x=0;
     int y=0;

     if(x.Equals(y++))// Returns True

【问题讨论】:

@版主:在结束任何问题之前阅读完整的问题。如果您有权关闭任何问题,请在正确的地方使用它们。 @Jørn Schou-Rode,Arcturus,Oded,Pandiya Chendur,GregS:因为你们都投票结束了这个问题。请为我提供上述问题的正确答案或重新打开问题。 【参考方案1】:

根据规范,这是预期行为。

第一个的行为受规范第 7.3 节的约束:

表达式中的操作数从左到右计算。例如,在F(i) + G(i++) * H(i) 中,使用 i 的旧值调用方法 F,然后使用 i 的旧值调用方法 G,最后使用 i 的新值调用方法 H。这与运算符优先级分开且无关。

因此在x==x++ 中,首先计算左侧操作数(0),然后计算右侧操作数(0x 变为 1),然后完成比较:@987654327 @ 是真的。

第二个的行为受第 7.5.5 节的约束:

如果 M 是在 value-type 中声明的实例函数成员: E 被评估。如果此评估导致异常,则不会执行进一步的步骤。 如果 E 未被归类为变量,则创建 E 类型的临时局部变量并将 E 的值分配给该变量。然后将 E 重新分类为对该临时局部变量的引用。临时变量可以在 M 中作为 this 访问,但不能以任何其他方式访问。因此,只有当 E 是一个真正的变量时,调用者才有可能观察到 M 对此所做的更改。 根据第 7.5.1 节中的描述评估参数列表。 M 被调用。 E引用的变量变成了this引用的变量。

请注意,值类型通过引用传递到它们自己的方法。

因此在x.Equals(x++) 中,首先评估目标(E 是x,一个变量),然后评估参数(0x 变为1),然后完成比较: x.Equals(0) 是假的。

编辑:我还想感谢 dtb 现已撤回的评论,该评论是在问题结束时发布的。我认为他在说同样的话,但是由于 cmets 的长度限制,他无法完全表达出来。

【讨论】:

【参考方案2】:

评估顺序。 ++ 评估第一个(第二个示例)。但在第一个示例中, == 先执行。

【讨论】:

哇!我不敢相信我的眼睛......我会回复你 任何时候都可以......但输出将保持不变,即使你在一年后来......:) 我认为这个答案的总体思路是正确的,对于第二个和第三个例子: 1. Equals 的参数被评估,这将“保留” 0 作为值参数,但它也会将 x 增加 1。 2. 执行 Equals。如果 x=0,则 x.Equals(x++) 变为 1.Equals(0)。第一个示例和第二个示例之间的区别在于 == 在 x 本身设置为 x+1 之前执行。如果您重载结构上的运算符并进行调试,您会看到它实际上会在 == 之前进入 ++,但它不会对 ++ 的结果做任何事情,直到它出现的表达式被评估之后。 确切地说,这不是评估顺序。首先评估 Equals 方法的目标。但结果不是 x (0) 的值,而是 x 的地址,因为值类型上的方法接收“this”指针,而不是目标的值。

以上是关于== vs C#中的等于的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 C# 中的(目录)路径?

如何比较 C# 中的(目录)路径?

VS2010 Chart控件Chart控件在ASP.NET网站中的应用示例详解(C#语言)

是否可以使用 VS2010 分析器对 C# 中的主线程以外的线程进行采样

无法正确单步执行静态构造函数中的代码(VS2019、C#、.NET 4.7.2)

微软计划闭源在VS Code中的C#扩展,惹开发者唾弃