代码之家  ›  专栏  ›  技术社区  ›  Adam Lear

当循环遍历函数结果时,foreach如何工作?

  •  29
  • Adam Lear  · 技术社区  · 16 年前

    假设我有以下代码:

    foreach(string str in someObj.GetMyStrings())
    {
        // do some stuff
    }
    

    someObj.GetMyStrings() 是否在循环的每次迭代中都被调用?是否最好改为执行以下操作:

    List<string> myStrings = someObj.GetMyStrings();
    foreach(string str in myStrings)
    {
        // do some stuff
    }
    

    ?

    4 回复  |  直到 16 年前
        1
  •  51
  •   Jon Skeet    16 年前

    函数只调用一次,以返回 IEnumerator<T> ; 在那之后 MoveNext() 方法和步骤 Current

    foreach (Foo f in GetFoos())
    {
        // Do stuff
    }
    

    在某种程度上相当于:

    using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            Foo f = iterator.Current;
            // Do stuff
        }
    }
    

    请注意,迭代器是在末尾处理的-这对于从迭代器块处理资源尤其重要,例如:

    public IEnumerable<string> GetLines(string file)
    {
        using (TextReader reader = File.OpenText(file))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
    

    IDisposable 狡猾地使那工作。

        2
  •  18
  •   Nestor    16 年前

    不函数将被调用一次以获取IEnumerable。。然后会重复调用MoveNext和Current。

        3
  •  3
  •   Matthew    16 年前

        4
  •  0
  •   Paul M    8 年前

    如果你陷入“所有的都是一样的”的境地,就把问题四舍五入; 对于(int x=0;x<provisulling();x++)