一文详解枚举器和迭代器( 二 )


static void Main{foreach(int item in demo){Console.WriteLine(item);}}static IEnumerable<int> Foo{yield return 1;yield return 2;yield return 3;}迭代器中的return
再迭代器中我们无法使用 return 跳出迭代器,只能使用 yield break来跳出迭代器 。我们来看一段代码:
static IEnumerable<int> demo{yield return 1;yield return 2;yield return 3;yield break;yield return 4;}上述代码中我们使用了 yield break来跳出迭代器,yield break 后面的 yield return 4将不再返回 。
这里需要注意的是 yield return 语句不可以出现在 try...catch...finally 语句块中 。
但是如果没有 catch 语句块,只有 try..finally 语句块,则 yield return 可以出现在其中 。
在 try..finally 语句块中,当枚举器到达终点时或者被释放掉时,finally 语句块中的代码就会执行,如果执行了 yield return 那么 foreach 语句也会释放掉枚举器,然后执行 finally 中的代码 。
当我们显示使用枚举器时如果没有释放掉枚举,那么将不会执行 finally 中的代码,为了避免这种情况的出现我们可以使用 using 语句 。
迭代器我们可以嵌套使用,我们看一下例子:
class Program{static void Main(string[] args){foreach (int fib in GetNum(Fibs(12)))Console.WriteLine(fib);Console.Read;}static IEnumerable<int> Fibs(int count){int result = 0;for (int i = 0; i < count; i++){yield return result;result = result + i;}}static IEnumerable<int> GetNum(IEnumerable<int> sequence){foreach (int x in sequence){yield return x;}}}上述例子中每个元素在 MoveNext 操作请求的时候才会被计算,也就是说 foreach (int fib in GetNum(Fibs(12)))没执行一次循环每个元素值就会被计算一次 。
这里需要注意,一般来说迭代器都会结合 foreach语句一起使用,每次循环完成后都必须显示的或隐式的调用 Dispose方法来释放掉枚举器 。
这篇文章基本上涵盖了迭代器和枚举器的所有内容,如果需要进一步学习迭代器与枚举器,需要自己动手实践一下 。
作者简介:朱钢,笔名喵叔,CSDN博客专家,.NET高级开发工程师,7年一线开发经验,参与过电子政务系统和AI客服系统的开发,以及互联网招聘网站的架构设计,目前就职于北京恒创融慧科技发展有限公司,从事企业级安全监控系统的开发 。




推荐阅读