他の人が書いたコードをリファクタリングしているときに、私には理解できない奇妙なことに出くわしました。なぜそれが起こるのか誰かが説明してくれることを願っています。
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 への代入が行われていると私は考えています。私の 3 番目のコードはうまく伝わらないかもしれませんが、それを表現するより良い方法は思いつきません!
要するに:
- 3 番目のコード スニペットは常に最初のコード スニペットと同じ結果になりますか?
- 最初のコード スニペットが 2 番目のコード スニペットと同じことをしないのはなぜですか?