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 相关文章推荐
用缓存实现静态页面的测试
Dec 06 PHP
PHP提取中文首字母
Apr 09 PHP
如何用php获取程序执行的时间
Jun 09 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
php命令行用法入门实例教程
Oct 27 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 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 CKEditor 上传图片实现代码
2009/11/06 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
vue注册组件的几种方式总结
2018/03/08 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
详解Django框架中的视图级缓存
2015/07/23 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
scrapy爬虫实例分享
2017/12/28 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python实现udp传输图片功能
2020/03/20 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
幼儿园大班家长评语
2014/04/17 职场文书
化学教育专业自荐信
2014/07/04 职场文书
医院义诊活动总结
2014/07/04 职场文书
关于诚信的活动方案
2014/08/18 职场文书
临时租车协议范本
2014/09/23 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python