如下所示的两个代码段之间有区别吗?
将属性加载到foreach
子句之前的变量中。
var someCollection = someClass.Collection;
foreach (var elem in someCollection)
{
// Do something
}
在
foreach
子句中内联访问的属性。foreach (var elem in someClass.Collection)
{
// Do something
}
第二个变体的优化程度是否较低?如果可以,为什么?
最佳答案
两种方法在优化或性能方面都没有区别。为了证明这一点,我创建了一个类似于您的简短示例:
public class C {
public void A() {
foreach (var item in SomeClass.Collection) {}
}
public void B() {
var someCollection = SomeClass.Collection;
foreach (var item in someCollection) {}
}
}
public static class SomeClass {
public static List<string> Collection { get; set; }
}
使用Roslyn .NET compiler版本2.9.0进行编译时,方法
A
和B
都将产生完全相同的中间代码,如下所示(reference)。A
和B
的方法主体List<string>.Enumerator enumerator = SomeClass.Collection.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
string current = enumerator.Current;
}
}
finally
{
((IDisposable)enumerator).Dispose();
}