C# 为什么在这个示例中(从msdn获得),在GetEnumerator方法中,new PeopleEnum返回IEnumerator?

C# 为什么在这个示例中(从msdn获得),在GetEnumerator方法中,new PeopleEnum返回IEnumerator?,c#,ienumerable,ienumerator,C#,Ienumerable,Ienumerator,为什么在这个来自MSDN的示例中,在GetEnumerator方法中,PeopleEnum返回IEnumerator 更新: 顺便说一句,如果数组数据类型实现了iClonable接口,为什么msdn通过编写for循环将pArray复制给了人?它需要准确返回IEnumerator才能正确实现IEnumerable接口。它是使用显式接口实现的,因此在公共API上可以看到PeopleEnum,但IEnumerable仍然很高兴 但实际上,在C2.0或更高版本中,您很少以这种方式编写枚举器;您将使用迭代

为什么在这个来自MSDN的示例中,在GetEnumerator方法中,PeopleEnum返回IEnumerator

更新: 顺便说一句,如果数组数据类型实现了iClonable接口,为什么msdn通过编写for循环将pArray复制给了人?

它需要准确返回IEnumerator才能正确实现IEnumerable接口。它是使用显式接口实现的,因此在公共API上可以看到PeopleEnum,但IEnumerable仍然很高兴

但实际上,在C2.0或更高版本中,您很少以这种方式编写枚举器;您将使用迭代器块返回。参见第6章免费章节

这里之所以存在PeopleEnum,是因为它看起来像.NET1.1示例,这是创建类型化枚举数的唯一方法。在.NET2.0及更高版本中有IEnumerable/IEnumerator,它有一个通过泛型.Current键入的类型

在.NET 2.0/C 2.0或更高版本中,我只需:

public class People : IEnumerable<Person> {
    /* snip */
    public IEnumerator<Person> GetEnumerator() {
        return ((IEnumerable<Person>)_people).GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator() { return _people.GetEnumerator();}
}

实现IEnumerable的类型需要一个名为GetEnumerator的方法,该方法返回IEnumerator。在这个例子中,有一个枚举器类PeopleEnum实现了IEnumerator,它在C2.0中已经过时了。它是C foreach语句内部使用的内容

一个更新的例子看起来更像下面的例子。注意,现在C支持迭代器,不再需要PeopleEnum类。实际上,编译器为您完成了所有繁重的工作

public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

   IEnumerator IEnumerable.GetEnumerator()
   {
       for (int i=0; i < _people.Length; i++) {
           yield return _people[i];
       }
   }
}

其实从来都不太苛刻。就像从不使用goto一样,yield有时会稍微慢一点,所以在极少数边缘情况下,有理由不使用yield。但同样,这是非常罕见的,所以这里没有-1,只是一个注释。@TomTom-修改为非常罕见-实际上,它在这里做任何事情都是令人惊讶的——它也可以像IEnumerator:return\u people.GetEnumerator@马克:或者它可以从集合中派生:@Josh-它看起来像一个1.1的例子。是的,我个人甚至不记得我上一次直接实现IEnumerable是什么时候了。我只是指出了一个事实,枚举器类现在已经基本灭绝了-P
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

   IEnumerator IEnumerable.GetEnumerator()
   {
       for (int i=0; i < _people.Length; i++) {
           yield return _people[i];
       }
   }
}