1
当前的.NET编译器是否以不同的方式对待它们?迭代ToList方法vs ToList数据保存在内存中
List<string> stuff = GetSomeStuff();
foreach(string thing in stuff) { ... }
VS
foreach(string thing in GetSomeStuff()) { ... }
当前的.NET编译器是否以不同的方式对待它们?迭代ToList方法vs ToList数据保存在内存中
List<string> stuff = GetSomeStuff();
foreach(string thing in stuff) { ... }
VS
foreach(string thing in GetSomeStuff()) { ... }
如果启用编译器的优化随后的代码两组将编译到相同的IL。例如,这是针对主方法的IL输出使用LinqPad时:
IL_0000: ldarg.0
IL_0001: call UserQuery.GetSomeStuff
IL_0006: callvirt System.Collections.Generic.List<System.String>.GetEnumerator
IL_000B: stloc.0
IL_000C: br.s IL_0016
IL_000E: ldloca.s 00
IL_0010: call System.Collections.Generic.List<System.String>.get_Current
IL_0015: pop
IL_0016: ldloca.s 00
IL_0018: call System.Collections.Generic.List<System.String>.MoveNext
IL_001D: brtrue.s IL_000E
IL_001F: leave.s IL_002F
IL_0021: ldloca.s 00
IL_0023: constrained. System.Collections.Generic.List<>.Enumerator
IL_0029: callvirt System.IDisposable.Dispose
IL_002E: endfinally
IL_002F: ret
的可能的复制[?通过函数结果循环时如何工作的foreach(https://stackoverflow.com/questions/1632810/ how-do-foreach-work-when-while-through-function-results) –
前者的唯一好处是如果你想用'stuff'变量来做其他事情。对于你的代码,你可以使用后者。 – mjwills