C# - foreach循环 - 良好实践

时间:2011-12-07 09:12:24

标签: c# .net performance loops foreach

这是好还是坏:

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

或者我应该像那样使用它以获得更好的速度:

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

7 个答案:

答案 0 :(得分:6)

只要MatchCollection不能为空,我就说这是你的选择。

但如果结果为空并且您未事先检查它,则会遇到NullReferenceException

答案 1 :(得分:3)

速度没有任何区别。这只是一种风格问题。

在这两种情况下,都会通过IEnumerator方法创建GetEnumerator()。这只发生一次。在每个后续循环条目中,只会调用方法MoveNext()

答案 2 :(得分:3)

第二个可能是首选,因为:

  • 您可以轻松发送一个断点来跟踪它(调试)
  • 如果您需要进行更改,您也不会更改循环(不应该受到影响)。
  • 更易于阅读
  • 如果您想在循环之前添加验证
  • ,请使用Nessesary

答案 3 :(得分:3)

我更喜欢后者,尽管它们之间没有区别。因为第二个似乎更清晰,并且您将来可以轻松添加更多。

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

}
//do something to matches in the future

答案 4 :(得分:1)

没有差异,但我说第二个更容易理解,更清晰,更容易阅读第一个。

要检查详细信息,请使用deaasembler或reflator。

如果你想在foreach循环之后使用matches集合,那么第二个是有用的。

答案 5 :(得分:1)

取决于代码中的更多位置是否需要matches。我认为使用

可能更干净
foreach (Match match in serverNameRegex.Matches(loginPage))
{
}

因为它会在循环完成后清理变量

答案 6 :(得分:-2)

两者和第一个之间存在速度差异:

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

更快。

原因是,在第一个中,serverNameRegex.Matches(loginPage)被评估一次,fo​​r循环已经知道每个匹配值,而在:

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

循环必须在每次迭代中评估匹配集合。