== vs C等于#

在C#中评估==和Equals有什么区别?

对于Ex,

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 

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

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

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

因此,在x==x++ ,首先评估左操作数( 0 ),然后评估右手( 0x变为1 ),然后进行比较: 0 == 0为真。

第二部分的行为受第7.5.5节的约束:

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

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

因此,在x.Equals(x++) ,首先计算目标(E是x ,变量),然后计算参数( 0x变为1 ),然后进行比较: x.Equals(0)为false 。

编辑:我也想赞扬dtb现在撤回的评论,在问题结束时发布。 我认为他说同样的话,但由于评论的长度限制,他无法完全表达。

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