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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
php初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
PHP 缓存实现代码及详细注释
May 16 PHP
php中去除所有js,html,css代码
Oct 12 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
php简单实现批量上传图片的方法
May 09 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 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查询mssql出现乱码的解决方法
2014/12/29 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Python实现识别手写数字大纲
2018/01/29 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
pymysql的简单封装代码实例
2020/01/08 Python
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
门卫人员岗位职责
2013/12/24 职场文书
优秀教师事迹简介
2014/02/02 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
万里长城导游词
2015/01/30 职场文书
廉政承诺书2015
2015/04/28 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
Nginx的基本概念和原理
2022/03/21 Servers
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js