首页 > 编程语言 >C#中的yield return详细解释

C#中的yield return详细解释

时间:2023-05-18 11:11:11浏览次数:32  
标签:return C# yield 斐波 int 使用

C# 中的 yield return 是一个强大的关键字,它可以帮助我们在不创建临时集合的情况下,实现可枚举的值的生成。yield return 可以实现延迟执行(Lazy Evaluation), 更具可读性和优化内存的使用。

yield return 的工作原理

在 C# 中,当我们使用 yield return 时,编译器会为我们生成一个名为 "Enumerator" 的状态机。这个状态机将记录每次迭代的状态,从而从上一次迭代的地方继续执行,而不需要重新开始。这使得我们可以在循环中逐个返回值,而无需一次性返回所有值。

使用 yield return 的时候,需要注意以下几点:

1. yield return 只能在返回类型为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T> 的方法、属性或索引器中使用。

2. 不能在 try-catch 块中使用 yield return。

3. 可以在 try-finally 块中使用 yield return,但不能在 finally 块中使用。

示例

以下示例演示了如何使用 yield return 生成斐波那契数列的前 n 个数。

csharp using System;

using System.Collections.Generic;

public class FibonacciGenerator

{

  public static IEnumerable<int> GetFibonacciNumbers(int count)

  {

    int a = 0;

    int b = 1;

    for (int i = 0; i < count; i++)

     {

      // 使用 yield return 返回当前的斐波那契数 yield return a;

      // 计算下一个斐波那契数 int temp = a + b; a = b; b = temp;

    }

   }

}

 

public class Program

{

   public static void Main()

  {

    // 获取斐波那契数列的前 10 个数

    IEnumerable<int> fibonacciNumbers = FibonacciGenerator.GetFibonacciNumbers(10);

    // 打印斐波那契数列

    Console.WriteLine("前10个斐波那契数:");

    foreach (int number in fibonacciNumbers)

    {

      Console.WriteLine(number);

    }

  }

}

优势

1. 延迟执行:yield return 只在需要时执行,这意味着我们不需要为所有可能的结果分配内存,从而节省了内存资源。

2. 可读性:使用 yield return 编写的代码更易于阅读和理解,因为它避免了复杂的逻辑和额外的数据结构。

3. 性能:由于不需要创建临时集合来存储结果,yield return 可以在多次迭代中提供更好的性能。 总结 ----- C# 中的 yield return 是一个非常有用的关键字,它允许我们以更简洁、高效的方式编写代码。通过使用 yield return,我们可以实现延迟执行,提高代码的可读性,并优化内存使用。

希望本文能帮助您更好地理解和使用 yield return。

标签:return,C#,yield,斐波,int,使用
From: https://www.cnblogs.com/ljx111/p/17411347.html

相关文章

  • 03]FlexCel的将DBGrid1导出为Excel
    usesFlexCel.Core,FlexCel.XlsAdapter;procedureDataSetToXLS(XLSX:TExcelFile;DataSet:TDataSet;WorkSheetCount:Integer=1;ActiveSheet:Integer=1);varioldrecno,icol,irow:integer;fmt:TFlxFormat;fmtDateTime:Integer;begin......
  • .gitlab-ci.yml 语法错误导致 runner 报错“expected shallow list”
    报错信息:Runningwithgitlab-runner15.11.0(xxx)ongitrunnrxxx,systemID:s_xxxPreparingthe"shell"executor00:00Preparingenvironment00:00GettingsourcefromGitrepository00:01Fetchingchangeswithgitdepthsetto20...Reinitializ......
  • [rarcrack] you don't have a right permissions!
    https://blog.csdn.net/l1028386804/article/details/84504217https://blog.csdn.net/The_IT_Crowd/article/details/7672676备忘用,老是忘记怎么暴力破解压缩包,这个错误加两个--就行。juwan@juwan-n85-dls:~$rarcrackSchool_Days.rar-threads4-typerarRarCrack!0.2......
  • el-table的header-row-class-name或者row-class-name不生效的解决办法?
    思路如果使用的node脚手架,你的style标签长这样:<stylescoped></style>,那么只需要在给header-row-class-name或者row-class-name指定的css类上做个样式穿透。解决办法如:<el-table row-class-name="table-row-class"></el-table><stylescoped> /deep/.table-row-clas......
  • 水晶报表 加载报错 An error has occurred while attempting to load the Crystal Rep
    源错误:CrystalReportsAnerrorhasoccurredwhileattemptingtoloadtheCrystalReportsruntime.EithertheCrystalReportsregistrykeypermissionsareinsufficientortheCrystalReportsruntimeisnotinstalledcorrectly.Pleaseinstalltheappropriate......
  • OpenHarmony Docker移植实践
      Docker简介从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环。Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的抽象,让用户程序部署在一个相对隔离的运行环境,并提供自动管理机制。需要额外指出的是......
  • AT_abc_260_f 总结
    题目:AT_abc_260_f链接:洛谷,AT,vjudge题意有一个\(S+T\)个点\(m\)条边的简单无向图\(G\)。点集\(V1\)包括点\(1-S\),点集\(V2\)包括点\(S+1-S+T\),同点集的点没有边相连,请输出一个按任意顺序输出任意长度为\(4\)的简单环。数据范围:\(2\leS\le3\times......
  • 【C++】多态(下)
    @TOC1.单继承中的虚函数表整体代码#include<iostream>usingnamespacestd;classBase{public:virtualvoidFunc1(){cout<<"Base::Func1()"<<endl;}virtualvoidFunc2(){cout<<"Base::Func......
  • BFT 最前线 | WPS AI接入四大办公软件;OpenAI准备开源新模型;OpenAI CEO首次出证国会;百
    原创|文BFT机器人AI视界TECHNOLOGYNEWS01WPSAI宣布接入文字、表格、PPT、PDF四大办公软件,AI能力大升级5月16日,金山办公旗下人工智能应用WPSAI,宣布四大办公组件全面升级:包括文字、表格、PPT和PDF,相比4月只有文字组件升级,这次升级涵盖了更广范围,并展示了WPSAI在阅读理解和人......
  • java opencv配置环境变量
    javaopencv配置环境变量Windows开发环境:1、下载路径:opencv官网下载文件,解压,我这里用的版本是3.4.16。2、解压后opencv\build\java\x64目录下的opencv_java3416.dll文件拷到C盘的system32下,opencv\build\java下面的opencv-3416.jar文件复制到本地D盘,新建lib文件夹里面,可以直接通......