当前位置:首页 > PHP教程 > php高级应用 > 列表

php和C#的yield迭代器实现方法对比分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-04 20:44:31 浏览: 评论:0 

本文实例讲述了php和C#的yield迭代器实现方法对比,分享给大家供大家参考,具体如下:

yield关键字是用来方便实现迭代器的,免去了手工写迭代器的繁琐,迭代器常被用来实现协程,所以大部分的协程中都有yield关键字,可以参看unity3D的协程。

C#版本:

函数的返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。

IEnumerable表示一个类可以迭代,也就是可以用foreach遍历,IEnumerator是真正的迭代器实现,IEnumerable和IEnumerator一个是使用迭代器的接口,一个是实现迭代器的接口。

C#是怎么用yield实现迭代器的呢?其实是编译器根据yield关键字生成了内部类,反编译一下就可以看到。

  1. using System.Collections; 
  2. class Program 
  3.    //返回IEnumerable接口,其实返回了编译器生成的内部类 
  4.   public static IEnumerable fib(int n) 
  5.   { 
  6.     int cur = 1; 
  7.     int prev = 0; 
  8.     for (int i = 0; i < n; i++) 
  9.     { 
  10.       yield return cur; 
  11.       int temp = cur; 
  12.       cur = prev + cur; 
  13.       prev = temp; 
  14.     } 
  15.   } 
  16.   static void Main() 
  17.   { 
  18.     // Display powers of 2 up to the exponent 8: 
  19.     foreach (int i in fib(9)) 
  20.     { 
  21.       Console.Write("{0} ", i); 
  22.     } 
  23.   } 
  24. // prints: 1 1 2 3 5 8 13 21 34 

php版本:

函数返回类Generator,而类Generator实现了迭代器接口Iterator。

  1. <?php 
  2. //返回Iterator接口,php解释器帮我们返回了Generator类 
  3. function fib($n
  4.   $cur = 1; 
  5.   $prev = 0; 
  6.   for ($i = 0; $i < $n$i++) { 
  7.     yield $cur
  8.     $temp = $cur
  9.     $cur = $prev + $cur
  10.     $prev = $temp
  11.   } 
  12. $fibs = fib(9); 
  13. foreach ($fibs as $fib) { 
  14.   echo " " . $fib
  15. // prints: 1 1 2 3 5 8 13 21 34

Tags: C yield php迭代器

分享到: