【求助】IEnumerable接口的实现

codeos 2015-02-25 08:33:25
MSDN中对于IEnumerable接口的实现给出了如下示例代码:
using System;
using System.Collections;

public class Person
{
public Person(string fName, string lName)
{
this.firstName = fName;
this.lastName = lName;
}

public string firstName;
public string lastName;
}

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()
{
return (IEnumerator) GetEnumerator();
}

public PeopleEnum GetEnumerator()
{
return new PeopleEnum(_people);
}
}

public class PeopleEnum : IEnumerator
{
public Person[] _people;

// Enumerators are positioned before the first element
// until the first MoveNext() call.
int position = -1;

public PeopleEnum(Person[] list)
{
_people = list;
}

public bool MoveNext()
{
position++;
return (position < _people.Length);
}

public void Reset()
{
position = -1;
}

object IEnumerator.Current
{
get
{
return Current;
}
}

public Person Current
{
get
{
try
{
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}

class App
{
static void Main()
{
Person[] peopleArray = new Person[3]
{
new Person("John", "Smith"),
new Person("Jim", "Johnson"),
new Person("Sue", "Rabon"),
};

People peopleList = new People(peopleArray);
foreach (Person p in peopleList)
Console.WriteLine(p.firstName + " " + p.lastName);

}
}


IEnumerable接口中只有一个方法GetEnumerator,只要在class People当中实现GetEnumerator()就可以了,
class People当中已经有了一个
public PeopleEnum GetEnumerator()
{
return new PeopleEnum(_people);
}


那么
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator) GetEnumerator();
}

这个函数是什么意思?函数名是IEnumerable.GetEnumerator?
...全文
191 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
codeos 2015-02-25
  • 打赏
  • 举报
回复
引用 1 楼 kxyzjm62 的回复:
http://blog.csdn.net/byondocean/article/details/6871881
谢谢分享,大概了解了IEnumerable接口的用法原理。
  • 打赏
  • 举报
回复
要想满足 foreach 语句的使用,其实是不需要 IEnumerable 接口的,只要提供一个 GetEnumerator 方法就可以。你可以把那个接口从 People类中去掉看看。这肯定是为了与早先的某些设计想兼容(虽然现在已经很难看出为什么还要维系这种东西了)。 可以看出来,编译器在处理 foreach 语法时 考虑 IEnumerator 接口的方案是随后加上去的设计。你可以把 PeopleEnum GetEnumerator() 方法去掉而仅留下IEnumerable 接口看看。 msdn的这个例子不好。它弄了个“四不像”的东西,两种支持foreach编译的写法全都提供了,结果必有一种是“多余的”!
kxyzjm62 2015-02-25
  • 打赏
  • 举报
回复
http://blog.csdn.net/byondocean/article/details/6871881
codeos 2015-02-25
  • 打赏
  • 举报
回复
引用 8 楼 angel6709 的回复:
隐藏接口实现
谢谢~
codeos 2015-02-25
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
接口的显示实现,查下相关资料,隐式实现,显示实现
谢谢~
codeos 2015-02-25
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
实现一个接口中的方法,不需要为方法声明为 public 的。private、protected、internal等等也都可以。 实现一个接口的方法,写成“接口名.方法”也是可以的,编译器会优先认识到这个签名的方法才是用来实现接口的。这也没有什么。 msdn的例子,关键的问题是,虽然它给你示例 IEnumerable 的用法,但是这个东西毫无作用,你设置断点之后可能会发现它从来也不执行。因此它是应该可以被删除的例子。
谢谢指教
angel6709 2015-02-25
  • 打赏
  • 举报
回复
隐藏接口实现
  • 打赏
  • 举报
回复
接口的显示实现,查下相关资料,隐式实现,显示实现
  • 打赏
  • 举报
回复
实现一个接口中的方法,不需要为方法声明为 public 的。private、protected、internal等等也都可以。 实现一个接口的方法,写成“接口名.方法”也是可以的,编译器会优先认识到这个签名的方法才是用来实现接口的。这也没有什么。 msdn的例子,关键的问题是,虽然它给你示例 IEnumerable 的用法,但是这个东西毫无作用,你设置断点之后可能会发现它从来也不执行。因此它是应该可以被删除的例子。
codeos 2015-02-25
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
要想满足 foreach 语句的使用,其实是不需要 IEnumerable 接口的,只要提供一个 GetEnumerator 方法就可以。你可以把那个接口从 People类中去掉看看。这肯定是为了与早先的某些设计想兼容(虽然现在已经很难看出为什么还要维系这种东西了)。 可以看出来,编译器在处理 foreach 语法时 考虑 IEnumerator 接口的方案是随后加上去的设计。你可以把 PeopleEnum GetEnumerator() 方法去掉而仅留下IEnumerable 接口看看。 msdn的这个例子不好。它弄了个“四不像”的东西,两种支持foreach编译的写法全都提供了,结果必有一种是“多余的”!
要满足foreach语句的使用有两种方法: 方案1:这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。 方案2:让这个类实现IEnumerable接口. 我们来看方案二: 我们只需要在People类中实现这样一个方法:
public IEnumerator GetEnumerator()
{
    return new PeopleEnum(_people);
}
但是MSDN例子中的这个方法感觉很困惑:
IEnumerator IEnumerable.GetEnumerator()
{
   return (IEnumerator) GetEnumerator();
}
没有public限定,函数名成了IEnumerable.GetEnumerator?

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧