C#枚举器的解救办法
C# 2.0 的解救办法
使用C# 2.0 这些问题如同五月末的雪般融化了。在这个例子的2.0版本中,我重写上面的列表,使用C# 2.0的两个新特性:泛型 和 枚举器。
我以重新定义实现IEumerable<string>的ListBox作为开始:
public class ListBox : IEnumerable<string>
这样做确定这个类可以在foreach循环中使用,同时确保迭代的值是string类型。
现在,从上个例子中挪去整个嵌套类,并且用下面的代码替换 GetEnumerator方法。
public IEnumerator<string> GetEnumerator()
{
foreach (string s in strings)
{
yield return s;
}
}
GetEnumerator方法使用了新的 yield 语句。yield语句返回一个表达式。yield语句仅在迭代块中出现,并且返回foreach语句所期望的团埋昌值。那也就是,对GetEnumerator的每次调用都将会产生集合中的下一个字符串;所有的状态管理已经都为液源你做好了!
就这样了,你已经完成了。不需要为每个类型实现你自己的enumerator,不需要创建嵌套类。你已经移除了至少30行代码,并且极大地简化了你的代码。程序继续像期望的那样运行,但是状态管理不再是你的任务,所有的都为你做好了。更进一步,由枚举器所返回的值一定是string类型,如果你想要返回其他类型,你塌扒可以修改IEnumerable泛型语句,IEnumerable泛型语句将反射新类型。