哪些类型的类可以使用foreach循环?
发布于 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。
为了证明第一点,下面的代码工作得很好:
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循环相当于:
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
发布于 2008-12-29 22:55:12
来自MSDN:
foreach语句为、数组或对象集合中的每个元素重复一组嵌入语句。foreach语句用于循环访问集合以获取所需的信息,但不应用于更改集合的内容以避免不可预知的副作用。(强调我的)
所以,如果你有一个数组,你可以使用foreach语句来迭代数组,如下所示:
 int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
    foreach (int i in fibarray)
    {
        System.Console.WriteLine(i);
    }您还可以使用它来遍历List<T>集合,如下所示:
List<string> list = new List<string>();
foreach (string item in list)
{
    Console.WriteLine(item);
}发布于 2008-12-29 23:12:55
根据博客文章的说法,使用的是鸭子打字。
https://stackoverflow.com/questions/398982
复制相似问题