• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c# yield提高代码性能和可读性

c# yield提高代码性能和可读性

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#yield,c#yield return,c#yield是什么意思,yield,yield是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

对于”yield”这个关键字我已经见过N次了,直到最近我才知道这个关键字所蕴含的力量。我将在下面展示出一些使用”yield”让你的代码有更高可读性和更好性能的例子

为了让你对yield有一些快速概览,我首先要展示一个没有使用这个关键字的例子,下面的代码很简单

 foreach(var currName in names)
 {
  if(currName == "Bob")
   bobs.Add(currName);
 }

 return bobs;
}
</div>

注意在这里我使用IEnumerable<string>作为参数类型并以IList<string>作为返回类型,通常来说,我更倾向于在参数输入的类型方面的范围越宽越好,但在返回类型上面更加严格(译者按:即输入时多用基类或接口,返回时用子类或实现类),对于输入来说,如果你需要用foreach来对其进行循环的话,使用IEnumerable会更有意义。而对于输出(译者按:也就是返回),我使用接口来让实现部分可以改变。在这里我想让调用者省去生成列表的麻烦,所以我选择list作为返回类型.

 而问题在于,我的设计并不具有可链接性,这样的设计需要产生列表作为返回值,实现上,这个列表或许不会很大,但这并不必要

现在,让我们来看看以“yield”的方式来做这些,而后我会解释如何使用它,以及它工作的原理。

在这个版本中,我们将返回类型改为IEnumerable,并且我们使用”yield return”.注意我再也不需要创建一个列表,现在是不是有些迷惑的?别着急,在理解它的工作方式的情况它会变的越来越简单.

当使用”yield return”关键词组时,.net会为你生成一大串管道代码,你可以尽管假装这是个魔法。当开始在被调用的代码中循环时(这里不是list),实现上发生的是这个函数被一遍一遍的调用,但每一次都从上一次执行退出的部分开始继续执行

传统的执行方法
调用函数
函数执行并返回list
调用部分使用返回的list
Yield的执行方法
调用函数
调用者请求item
下一个item返回
回到步骤2
虽然yield执行的实现貌似有些复杂,但我们最终只需要一次“弹出”一个item,而不是创建整个list并返回.

对于句法说,我个人认为yield更加简洁,并且对于传递函数的用途表现的更好(译者按:也就是代码可读性),我使用IEnumerable作为返回类型来通知调用者它可以被foreach循环并且返回数据,而调用者现在可以自己决定它是否愿意将返回值存放到列表中,即使这会以性能作为代价。

在我提供的这个简单例子中,也许你并不能发现很多使用yield的好处,然而,你可以在调用者需要取消遍历所有的函数提供的内容时节省很多不必要的工作,当你在方法链接时使用yield,你可以省下的工作(时间)或许会成倍叠加。

Ayende已经有了很棒的例子:using yield for a slick pipes & filters implementation,他甚至还讲述了:version that is multi-threaded。这让我觉得非常有趣.

最开始我对yield的保留意见是使用这个关键字或许会导致潜在的性能问题,但实际上,至今为止我还未能发现任何信息来说明关于yield对性能的影响,而我在上面提到提高性能的地方远远大于编译器overhead那部分。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C# yield在WCF中的错误使用(二)
  • C# yield关键字详解
  • C# yield在WCF中的错误用法(一)
  • C#通过yield实现数组全排列的方法
  • C#特性 迭代器(下) yield以及流的延迟计算
  • C#中yield return用法分析
  • C#使用yield关键字让自定义集合实现foreach遍历的方法
  • c# yield提高代码性能和可读性
  • C#中的yield关键字的使用方法介绍

相关文章

  • 2017-05-28C#类的访问修饰符用法分析
  • 2017-05-28C#实现创建,删除,查找,配置虚拟目录实例详解
  • 2017-05-28C#实现集合转换成json格式数据的方法
  • 2017-05-28C#禁止textbox复制、粘贴、剪切及鼠标右键的方法
  • 2017-05-28C#中读写INI文件的方法例子
  • 2017-05-28根据灰度值填充字符-单文件单线程版
  • 2017-05-28深入多线程之:深入生产者、消费者队列分析
  • 2017-05-28异步/多线程/任务/并行编程之一:如何选择合适的多线程模型?
  • 2017-05-28DevExpress实现自定义TreeListNode的Tooltip的方法
  • 2017-05-28c#异步读取数据库与异步更新ui的代码实现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c#读取excel方法实例分析
    • DevExpress实现自定义GridControl中按钮文字内容的方法
    • 深入委托与多播委托的详解
    • 浅谈C# 中的可空值类型 null
    • C# 反射(Reflection)的用处分析
    • C#类的访问修饰符用法分析
    • C#对XML文件的各种操作实现方法
    • C#实现的24点游戏实例详解
    • 枚举的用法详细总结
    • C#基础继承和多态详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有