c# - foreach循环-良好实践

本文关键字:循环 foreach | 更新日期: 2023-09-27 18:17:06

这是好是坏:

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

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

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

c# - foreach循环-良好实践

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

但是如果结果为null并且您没有事先检查它,您将遇到NullReferenceException

无论如何,速度都没有差别。这只是风格的问题。

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

我更喜欢后者,尽管它们之间没有区别。因为第二句似乎更清楚,以后可以很容易地添加更多。

MatchCollection matches = serverNameRegex.Matches(loginPage);
foreach (Match match in matches)
{
}
//do something to matches in the future

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

  • 你可以很容易地在它之后发送一个断点来跟踪它(调试)
  • 如果你需要做一个改变,你也没有改变循环(不应该受到影响)。
  • 更容易阅读
  • 如果你想在循环之前添加验证,必须

这没有什么区别,但我认为第二个比第一个更容易理解,更清晰,更容易阅读。

要检查详细信息,请使用反汇编器或再编译器。

如果您想在foreach循环之后使用matches collection,
是非常有用的。

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

可能更简洁
foreach (Match match in serverNameRegex.Matches(loginPage))
{
}

因为它会在循环结束后清理变量

两者之间的速度有差异:

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

更快。

原因是,在第一个中,serverNameRegex.Matches(loginPage)被求值一次,并且for循环已经知道每个匹配值,而在

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

循环必须在每次迭代中计算匹配集合。