首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中,foreach循环是如何工作的?

在C#中,foreach循环是如何工作的?
EN

Stack Overflow用户
提问于 2008-12-29 22:52:47
回答 7查看 97.8K关注 0票数 86

哪些类型的类可以使用foreach循环?

EN

回答 7

Stack Overflow用户

发布于 2008-12-29 23:01:43

实际上,严格地说,从角度讲,使用foreach所需要的只是一个公共GetEnumerator()方法,该方法返回带有bool MoveNext()方法和? Current {get;}属性的内容。然而,最常见的含义是“实现IEnumerable/IEnumerable<T>的东西,返回一个IEnumerator/IEnumerator<T>

言下之意,这包括实现ICollection/ICollection<T>的任何东西,比如Collection<T>List<T>、数组(T[])等。因此,任何标准的“数据集合”通常都支持foreach

为了证明第一点,下面的代码工作得很好:

代码语言:javascript
运行
复制
using System;
class Foo {
    public int Current { get; private set; }
    private int step;
    public bool MoveNext() {
        if (step >= 5) return false;
        Current = step++;
        return true;
    }
}
class Bar {
    public Foo GetEnumerator() { return new Foo(); }
}
static class Program {
    static void Main() {
        Bar bar = new Bar();
        foreach (int item in bar) {
            Console.WriteLine(item);
        }
    }
}

它是如何工作的?

foreach(int i in obj) {...}这样的foreach循环相当于:

代码语言:javascript
运行
复制
var tmp = obj.GetEnumerator();
int i; // up to C# 4.0
while(tmp.MoveNext()) {
    int i; // C# 5.0
    i = tmp.Current;
    {...} // your code
}

然而,也有一些变化。例如,如果枚举器(tmp)支持IDisposable,则也会使用它(类似于using)。

注意在循环内部(C# 5.0)和循环外部(up C# 4.0)声明"int i“的位置上的不同。如果您在代码块内的匿名方法/lambda中使用i,这一点很重要。但那是另一回事;-p

票数 166
EN

Stack Overflow用户

发布于 2008-12-29 22:55:12

来自MSDN

foreach语句为、数组或对象集合中的每个元素重复一组嵌入语句。foreach语句用于循环访问集合以获取所需的信息,但不应用于更改集合的内容以避免不可预知的副作用。(强调我的)

所以,如果你有一个数组,你可以使用foreach语句来迭代数组,如下所示:

代码语言:javascript
运行
复制
 int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
    foreach (int i in fibarray)
    {
        System.Console.WriteLine(i);
    }

您还可以使用它来遍历List<T>集合,如下所示:

代码语言:javascript
运行
复制
List<string> list = new List<string>();

foreach (string item in list)
{
    Console.WriteLine(item);
}
票数 7
EN

Stack Overflow用户

发布于 2008-12-29 23:12:55

根据博客文章的说法,使用的是鸭子打字。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/398982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档