繁体   English   中英

这两种使用foreach的方式有区别吗?

[英]Is there a difference between these two ways of using foreach?

下面显示的两个代码段之间有区别吗?

  1. foreach子句之前将属性加载到变量中。

     var someCollection = someClass.Collection; foreach (var elem in someCollection) { // Do something } 
  2. 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编译器版本2.9.0进行编译时 ,方法AB产生完全相同的中间代码,如下所示( 参考 )。

方法体AB

List<string>.Enumerator enumerator = SomeClass.Collection.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        string current = enumerator.Current;
    }
}
finally
{
    ((IDisposable)enumerator).Dispose();
}

性能或优化没有区别。 唯一的区别是你的代码中还有一个变量,它包含你的集合的引用(一个地址,一个“指针”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM