Это действительный цикл?


У меня есть следующий код:

private ScatterViewItem FindScatterViewOfSourceFile(SourceFile find)
{
   foreach (ScatterViewItem svi in classScatterViews)
   {
      if ((svi.Tag as SourceFile).Equals(find))
      {
         return svi;
      }
   }
   return null;
}

Теперь я спрашиваю себя, если это возможно, или если я должен лучше использовать:

private ScatterViewItem FindScatterViewOfSourceFile(SourceFile find)
{
   ScatterViewItem result = null;
   foreach (ScatterViewItem svi in classScatterViews)
   {
      if ((svi.Tag as SourceFile).Equals(find))
      {
         result = svi;
         break;
      }
   }
   return result;
}

Есть ли обычная practive, какой из них использовать? И как петли делать то же самое?



565
10
задан 4 марта 2011 в 11:03 Источник Поделиться
Комментарии
2 ответа

Первый в сто раз лучше, чем второй. Я бы не определить переменную, если вы действительно не нужно. Также я не верю в одно возвращаемое методами. Особенно я не верю, что они улучшают читаемость.

LINQ, которая определенно улучшить его:

return classScatterViews.FirstOrDefault(v => v.Tag.Equals(find));

Также я бы не использовать в качестве оператора, если я не проверить результат нуль.

22
ответ дан 4 марта 2011 в 12:03 Источник Поделиться

Так что вы слышали о хорошей практике, что метод должен быть только один оператор return.
Это в целом верно, но в вашем случае я считаю это не необходимым, потому что метод настолько мал. Основная причина этого 'правила' - это читабельность, так что вы знаете, что происходит. Оба образца код одинаково ясно. Когда у вас есть несколько мест, где возврат будет происходить, то лучше использовать второй подход.

Однако, я бы переписать его с помощью LINQ. Я считаю, что это должно работать:

private ScatterViewItem FindScatterViewOfSourceFile(SourceFile find)
{
return classScatterViews.FirstOrDefault( svi => svi.Tag.Equals(find) );
}

Обновление:

Также отметим, что приведение к конкретному типу вызова метода Equals() удаляется. Это является избыточным, так как правильный метод Equals() будет вызываться в любом случае.

9
ответ дан 4 марта 2011 в 11:03 Источник Поделиться