【发布时间】:2013-09-17 16:48:18
【问题描述】:
在重构一些别人写的代码时,我遇到了一些我不理解的奇怪现象,我希望有人能解释为什么会发生这种情况。
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 进行赋值,而不是像我想象的那样作为评估该表达式的第一部分。我的第三段代码可能无法很好地表达它,但我想不出更好的表达方式!
简而言之:
- 我的第三个代码 sn-p 是否总是与第一个代码给出相同的结果?
- 为什么第一个代码 sn-p 不做与第二个相同的事情?
【问题讨论】:
-
这种代码的推理困难正是它应该引发红旗的原因。
-
这正是布尔表达式不应该有副作用的原因。
-
我将重写它以使其更具可读性,我只是想确保在此过程中不会更改它的作用! (现在我很好奇发生了什么)
-
是什么让您相信在
if评估之后 完成了任务? -
@CodingGorilla 请参阅 Jon Skeet 的回答。