下面显示的两个代码段之间是否有区别?
在foreach
子句之前将属性加载到变量中。
var someCollection = someClass.Collection;
foreach (var elem in someCollection)
{
// Do something
}
在foreach
子句中内联访问属性。
foreach (var elem in someClass.Collection)
{
// Do something
}
第二个变体的优化程度是否较低?为什么?
答案 0 :(得分:4)
在优化或性能方面,这两种方法之间没有区别。为了证明这一点,我创建了一个类似于您的简短示例:
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 < / strong>)。
A
和B
List<string>.Enumerator enumerator = SomeClass.Collection.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
string current = enumerator.Current;
}
}
finally
{
((IDisposable)enumerator).Dispose();
}
答案 1 :(得分:3)
性能或优化上没有差异。唯一的区别是您的代码中还有一个变量,其中包含对集合的引用(地址,“指针”)。