C # - цикл foreach - хорошая практика - PullRequest
4 голосов
/ 07 декабря 2011

Хорошо это или плохо:

foreach (Match match in serverNameRegex.Matches(loginPage))
{
 ....
}

или я должен использовать это для лучшей скорости:

MatchCollection matches = serverNameRegex.Matches(loginPage);
foreach (Match match in matches)
{
  ...            
} 

Ответы [ 7 ]

6 голосов
/ 07 декабря 2011

Пока MatchCollection не может быть нулевым, я бы сказал, что это ваш выбор.

Но если он окажется нулевым, и вы не проверите его заранее, вы столкнетесь с NullReferenceException.

3 голосов
/ 07 декабря 2011

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

MatchCollection matches = serverNameRegex.Matches(loginPage);
foreach (Match match in matches)
{

}
//do something to matches in the future
3 голосов
/ 07 декабря 2011

Второй может быть предпочтительнее, так как:

  • Вы можете легко послать точку останова после нее, чтобы отследить ее (отладка)
  • Если вам нужно внести изменения, вы также не изменяете цикл (который не должен быть затронут).
  • Легче читать
  • Обязательно, если вы хотите добавить проверки перед циклом
3 голосов
/ 07 декабря 2011

Нет никакой разницы в скорости вообще. Это только вопрос стиля.

В обоих случаях IEnumerator будет создан методом GetEnumerator(). Это происходит только один раз. В каждой последующей записи цикла будет вызываться только метод MoveNext().

1 голос
/ 07 декабря 2011

Зависит от того, понадобится ли вам matches в других местах кода.Я думаю, что может быть более чистым использовать

foreach (Match match in serverNameRegex.Matches(loginPage))
{
}

, потому что он очистит переменную после завершения цикла

1 голос
/ 07 декабря 2011

в этом нет различий, но я говорю: Второй - более понятный, понятный и легко читаемый, чем первый.

Для подробной информации используйте деаасемблер или рефлятор.

и для второго полезно, если вы хотите использовать matches collection после цикла foreach.

0 голосов
/ 07 декабря 2011

Существует разница в скорости между двумя и первым:

 foreach (Match match in serverNameRegex.Matches(loginPage))
 {
      ....
 }

быстрее.

Причина в первом - serverNameRegex.Matches (loginPage) оценивается один раз, и цикл for уже знает о каждом значении совпадения, тогда как в:

 MatchCollection matches = serverNameRegex.Matches(loginPage);
 foreach (Match match in matches)
 {
    ...            
 } 

цикл должен оценивать коллекцию совпадений на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...