Есть ли недостижимый код в этом фрагменте? Я так не думаю, но Решарпер говорит мне иначе
У меня есть следующий метод, который я нашел в обзоре кода. Внутри цикла Resharper сообщает мне, что if (narrativefound == false)
неверен, потому что narrativeFound
всегда прав. Я не думаю, что это так, потому что для того, чтобы установить narrativeFound
в true, сначала нужно передать условное сравнение строк, так как всегда это может быть правдой? Я что-то упускаю? Это ошибка в 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;
}
Ответы
Ответ 1
Переменная narrativefound
никогда не будет правдой, когда управление достигнет этого утверждения:
narrativefound = true;
// ...
break; // This causes control to break out of the loop.
Я думаю, что Resharper пытается сказать вам, что условие narrativefound == false
всегда будет истинным.
Ответ 2
Вам не нужна переменная 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);
}
}
Ответ 3
Это ошибка в вашем коде.
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);
}
}
}
Ответ 4
R # правильно, потому что, если вы превращаете повествование в истинное, вы выходите из foreach сразу после его установки.
Ответ 5
Я считаю, что это говорит вам, что если IF narriativefound имеет значение true, то цикл for завершается (break;). Поэтому, если значение if (narriativefound = false) оценивается, оно всегда будет иметь значение false.