== vs C等于#

Adi*_*ngh 14 .net c# equality operators

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

对于Ex,

if(x==x++)//Always returns true
Run Code Online (Sandbox Code Playgroud)

if(x.Equals(x++))//Always returns false 
Run Code Online (Sandbox Code Playgroud)

编辑:

     int x=0;
     int y=0;

     if(x.Equals(y++))// Returns True
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 12

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

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

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

因此x==x++,首先对左操作数进行求值(0),然后对右手进行求值(0,x变为1),然后进行比较:0 == 0为真.

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

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

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

因此x.Equals(x++),首先评估目标(E是x变量),然后评估参数(0,x变为1),然后进行比较:x.Equals(0)为假.

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