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声明Run Code Online (Sandbox Code Playgroud)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 } }
很明显,x上述foreach语句中的表达式仅在扩展中计算一次.