У меня есть следующий метод, с которым я столкнулся в обзоре кода. В цикле Resharper говорит мне это if (narrativefound == false)
неправильный becuase narrativeFound
всегда верно. Я не думаю дело обстоит так, потому что для установки narrativeFound
к истинному это должно передать условную строку, выдерживают сравнение сначала, поэтому как это может всегда быть верно? Я пропускаю что-то? Действительно ли это - ошибка в Resharper или в нашем коде?
public Chassis GetChassisForElcomp(SPPA.Domain.ChassisData.Chassis asMaintained, SPPA.Domain.ChassisData.Chassis newChassis)
{
Chassis c = asMaintained;
List<Narrative> newNarrativeList = new List<Narrative>();
foreach (Narrative newNarrative in newChassis.Narratives)
{
bool narrativefound = false;
foreach (Narrative orig in asMaintained.Narratives)
{
if (string.Compare(orig.PCode, newNarrative.PCode) ==0 )
{
narrativefound = true;
if (newNarrative.NarrativeValue.Trim().Length != 0)
{
orig.NarrativeValue = newNarrative.NarrativeValue;
newNarrativeList.Add(orig);
}
break;
}
if (narrativefound == false)
{
newNarrativeList.Add(newNarrative);
}
}
}
c.SalesCodes = newChassis.SalesCodes;
c.Narratives = newNarrativeList;
return c;
}
Переменная narrativefound
никогда не будет истинной, когда контроль достигнет этого утверждения:
narrativefound = true;
// ...
break; // This causes control to break out of the loop.
Я думаю, что Решарпер пытается сказать вам, что условие narrativefound == false
всегда будет правдой.
Вам вообще не нужна переменная narrativeFound
. В области, в которой вы установили значение true, вы выходите из цикла foreach
. Если вы не установите для него значение true, вы не сломаетесь и добавите newNarrative
в newNarrativeList
.
Итак, это можно переписать как
foreach (Narrative newNarrative in newChassis.Narratives)
{
foreach (Narrative orig in asMaintained.Narratives)
{
if (string.Compare(orig.PCode, newNarrative.PCode) == 0)
{
if (newNarrative.NarrativeValue.Trim().Length != 0)
{
orig.NarrativeValue = newNarrative.NarrativeValue;
newNarrativeList.Add(orig);
}
break;
}
newNarrativeList.Add(newNarrative);
}
}
Это ошибка в вашем коде.
foreach (Narrative newNarrative in newChassis.Narratives)
{
bool narrativefound = false;
foreach (Narrative orig in asMaintained.Narratives)
{
if (string.Compare(orig.PCode, newNarrative.PCode) ==0 )
{
narrativefound = true;
if (newNarrative.NarrativeValue.Trim().Length != 0)
{
orig.NarrativeValue = newNarrative.NarrativeValue;
newNarrativeList.Add(orig);
}
// narrativeFound == true, but now we exit the for loop
break;
}
// narrativeFound is always false here. The test is redundant
if (narrativefound == false)
{
newNarrativeList.Add(newNarrative);
}
}
}
R # является правильным, потому что если вы измените значение narrativefound на true, вы выйдете из foreach сразу после того, как установите его.
Я полагаю, что это говорит вам о том, что поскольку IF IF narriativefound имеет значение true, то цикл for завершается (break;). Поэтому, если вычислить if (narriativefound == false), то оно всегда будет иметь значение false.