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下intval()和(int)转换使用与区别
Jul 18 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
PHP中计算字符串相似度的函数代码
Dec 29 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
php+js实现百度地图多点标注的方法
Nov 30 PHP
php实现等比例压缩图片
Jul 26 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 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
Sony CFR 320 修复改造
2020/03/14 无线电
深入密码加salt原理的分析
2013/06/06 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
用jquery来定位
2007/02/20 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
详解Vue之事件处理
2020/07/10 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
十条建议帮你提高Python编程效率
2016/02/16 Python
python迭代器与生成器详解
2016/03/10 Python
python hook监听事件详解
2018/10/25 Python
Python进阶之自定义对象实现切片功能
2019/01/07 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python3中确保枚举值代码分析
2020/12/02 Python
上班早退检讨书
2014/01/09 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
党支部审查意见
2015/06/02 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
java泛型通配符详解
2021/07/25 Java/Android