评估if语句中的表达式

pho*_*phy 5 c# syntax

在重构其他人编写的代码时,我遇到了一些我不理解的奇怪现象,我希望有人可以解释为什么会这样.

if (mystring.Length != (mystring = mystring.Replace("!#", replacement)).Length)
{
    i = 1;
}
else if (mystring.Length != (mystring = mystring.Replace("#", replacement)).Length)
{
    i = -1;
}
Run Code Online (Sandbox Code Playgroud)

认为这里会发生的事情是,由于括号具有最高优先级,括号内的赋值将首先发生,并且if和else if块中的任何代码都不会被执行.以下是我认为此代码实际上正在做的事情:

mystring = mystring.Replace("!#", replacement);
if (mystring.Length != mystring.Length)
{
    i = 1;
}
else
{
    mystring = mystring.Replace("#", replacement);
    if (mystring.Length != mystring.Length)
    {
        i = -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为唯一可能发生的事情就是改变mystring,因为在比较之前会进行分配.测试结果表明发生的事情实际上更接近于此:

string temp1 = mystring.Replace("!#", replacement);
string temp2 = mystring.Replace("#", replacement);
if (mystring.Length != temp1.Length)
{
    i = 1;
}
else if (mystring.Length != temp2.Length)
{
    i = -1;
}
if (i == 1)
{
    mystring = temp1;
}
else
{
    mystring = temp2;
}
Run Code Online (Sandbox Code Playgroud)

如果不清楚,我认为正在发生的事情是,在评估表达式的真实性之后,正在对mystring进行赋值,而不是像我想象的那样评估该表达式的第一部分.我的第三段代码可能无法很好地解决这个问题,但我想不出更好的表达方式!

简而言之:

  1. 我的第三个代码片段是否总能得到与第一个相同的结果?
  2. 为什么第一个代码片段与第二个代码片段的作用相同?

Jon*_*eet 11

优先权不是关于订购操作 - 它是关于绑定操作的.执行顺序始终从左到右.例如,如果你写:

int a = x * (y / z);
Run Code Online (Sandbox Code Playgroud)

然后x仍然评估y / z.

所以在这个表达式中:

if (mystring.Length != (mystring = mystring.Replace("!#", replacement)).Length)
Run Code Online (Sandbox Code Playgroud)

我们有:

  • 评估mystring.Length(我们将此值称为x)
  • 评估 (mystring = mystring.Replace("!#", replacement)).Length
    • 评估 mystring.Replace("!#", replacement)
    • 将结果分配给 mystring
    • 取长度(我们称之为y值)
  • 比较xy

从混乱中可以清楚地看出,这段代码非常糟糕 - 我很高兴你将它从当前的形式中重构出来.