C#更好地初始化列表然后循环它,或者只是在循环条件下初始化?

Sar*_*els 6 c# optimization foreach caching loops

我最终得到了很多像这样的代码:

List<string> dates = someMethodCall();
foreach (string dateStr in dates) { }
Run Code Online (Sandbox Code Playgroud)

我通常会声明我正在迭代的对象,然后在foreach不考虑someMethodCall()循环的每次迭代时会出现的情况下使用它.是这样的吗?我更愿意这样做:

foreach (string dateStr in someMethodCall()) { }
Run Code Online (Sandbox Code Playgroud)

但是我只想这样做,如果someMethodCall()只发生一次,然后在每次后续迭代中缓存其结果.

Meh*_*ari 14

在两种情况下,该方法仅被调用一次.

第一种方法具有可读性优势,因为您可以命名变量并使用其名称描述变量中的内容.它将使代码更加自我记录并提高可维护性.


引用权威来源:

C#语言规范 - 8.8.4 foreach声明

 foreach (V v in x) embedded-statement
Run Code Online (Sandbox Code Playgroud)

然后扩展到:

{
  E e = ((C)(x)).GetEnumerator();
  try {
  V v;
      while (e.MoveNext()) {
          v = (V)(T)e.Current;
          embedded-statement
      }
  }
  finally {
      … // Dispose e
  }
}
Run Code Online (Sandbox Code Playgroud)

很明显,x上述foreach语句中的表达式仅在扩展中计算一次.

  • 第一种方法也使调试更容易. (7认同)
  • 当您使用足够的详细信息命名方法调用时,谁需要var? (2认同)

Ano*_*on. 8

foreach 将对集合进行一次评估,获取迭代器,然后将其用于迭代.