在重构其他人编写的一些代码时,我遇到了一些我不理解的奇怪现象,我希望有人能解释为什么会发生这种情况。
if (mystring.Length != (mystring = mystring.Replace("!#", replacement)).Length)
{
i = 1;
}
else if (mystring.Length != (mystring = mystring.Replace("#", replacement)).Length)
{
i = -1;
}
我认为在这里会发生的是,由于括号具有最高优先级,括号内的赋值将首先发生,并且 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;
}
}
我认为唯一会发生的事情是对 的更改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;
}
如果不清楚,我认为正在发生的事情是在评估表达式的真实性之后对 mystring 进行分配,而不是像我想象的那样作为评估该表达式的第一部分。我的第三段代码可能无法很好地表达它,但我想不出更好的方式来表达它!
简而言之:
- 我的第三个代码片段总是会给出与第一个相同的结果吗?
- 为什么第一个代码片段不做与第二个相同的事情?