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编程语言开发动态WAP页面
Oct 09 PHP
WINXP下apache+php4+mysql
Nov 25 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
php中ob_flush函数和flush函数用法分析
Mar 18 PHP
php获取图片信息的方法详解
Dec 10 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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
谈一谈收音机的高放电路
2021/03/02 无线电
Laravel重写用户登录简单示例
2016/10/08 PHP
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
面包屑导航详解
2017/12/07 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Django URL传递参数的方法总结
2016/08/28 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
大学生的网络创业计划书
2013/12/26 职场文书
六个一活动实施方案
2014/03/21 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
交通安全寄语大全
2014/04/08 职场文书
中学生英语演讲稿
2014/04/26 职场文书
平安工地建设方案
2014/05/06 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
义诊活动通知
2015/04/24 职场文书
升学宴学生致辞
2015/07/27 职场文书
毕业欢送会致辞
2015/07/29 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang