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利用COM对象访问SQLServer、Access
Oct 09 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
PHP header()函数常用方法总结
Apr 11 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
php表单处理操作
Nov 16 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
php实现登录页面的简单实例
Sep 29 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 PHP
php利用ZipArchive类操作文件的实例
Jan 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
php给图片加文字水印
2015/07/31 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
javascript使用activex控件的代码
2011/01/27 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
JS常用算法实现代码
2016/11/14 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
nodejs多版本管理总结
2018/04/03 NodeJs
详解vue-router导航守卫
2019/01/19 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
js实现表格数据搜索
2020/08/09 Javascript
SQLite3中文编码 Python的实现
2017/01/11 Python
Python socket实现简单聊天室
2018/04/01 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
QML实现钟表效果
2020/06/02 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
剪枝的学问教学反思
2014/02/07 职场文书
会计专业求职信范文
2014/03/16 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
安全演讲稿大全
2014/05/09 职场文书
会员卡清退活动总结
2014/08/27 职场文书