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


Posted in PHP onJuly 17, 2019

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

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

C#版本:

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

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

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

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

php版本:

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

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP安全配置
Oct 09 PHP
十天学会php之第二天
Oct 09 PHP
最省空间的计数器
Oct 09 PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 PHP
PHP 调试工具Debug Tools
Apr 30 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
Jul 03 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
php基于协程实现异步的方法分析
Jul 17 #PHP
php学习笔记之字符串常见操作总结
Jul 16 #PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 #PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 #PHP
php array_chunk()函数用法与注意事项
Jul 12 #PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 #PHP
Laravel框架实现多数据库连接操作详解
Jul 12 #PHP
You might like
一个分页的论坛
2006/10/09 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
php牛逼的面试题分享
2013/01/18 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
几款好用的python工具库(小结)
2020/10/20 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
迪奥官网:Dior.com
2018/12/04 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
学期自我鉴定范文
2013/10/01 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
保险内勤岗位职责
2014/04/05 职场文书
不同意离婚答辩状
2015/05/22 职场文书
鲁冰花观后感
2015/06/10 职场文书
政审证明范文
2015/06/19 职场文书
2016高考感言
2015/08/01 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS