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 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
PHP入门学习笔记之一
Oct 12 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
Jul 03 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
php获取域名的google收录示例
Mar 24 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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函数)
2006/10/09 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python实现简单的四则运算计算器
2016/11/02 Python
python实现TF-IDF算法解析
2018/01/02 Python
selenium+python实现自动登录脚本
2018/04/22 Python
python3 线性回归验证方法
2019/07/09 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
大学生求职简历的自我评价
2013/10/14 职场文书
药学职务聘任书
2014/03/29 职场文书
学校对教师的评语
2014/04/28 职场文书
房地产广告策划方案
2014/05/15 职场文书
大学生毕业求职信
2014/06/12 职场文书
驻村工作简报
2015/07/20 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js