Есть ли в этом отрывке недостижимый код? Я не думаю так, но Resharper говорит мне иначе

У меня есть следующий метод, с которым я столкнулся в обзоре кода. В цикле 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; 
}
14
задан The Matt 18 May 2010 в 16:47
поделиться

5 ответов

Переменная narrativefound никогда не будет истинной, когда контроль достигнет этого утверждения:

narrativefound = true;
// ...
break;  // This causes control to break out of the loop.

Я думаю, что Решарпер пытается сказать вам, что условие narrativefound == false всегда будет правдой.

31
ответ дан 1 December 2019 в 06:59
поделиться

Вам вообще не нужна переменная 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);                 
     }
}
4
ответ дан 1 December 2019 в 06:59
поделиться

Это ошибка в вашем коде.

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
ответ дан 1 December 2019 в 06:59
поделиться

R # является правильным, потому что если вы измените значение narrativefound на true, вы выйдете из foreach сразу после того, как установите его.

1
ответ дан 1 December 2019 в 06:59
поделиться

Я полагаю, что это говорит вам о том, что поскольку IF IF narriativefound имеет значение true, то цикл for завершается (break;). Поэтому, если вычислить if (narriativefound == false), то оно всегда будет иметь значение false.

0
ответ дан 1 December 2019 в 06:59
поделиться