首页 >后端开发 >C#.Net教程 >C# 中的 Yield 关键字

C# 中的 Yield 关键字

王林
王林原创
2024-09-03 15:26:44325浏览

Yield 是 C# 中的上下文关键字。上下文关键字是 C# 中不为整个程序保留的关键字。相反,它们是程序某些部分的保留关键字,可以在其中相关地使用关键字。只要这些关键字的相关性不会向编译器传达任何特殊含义,这些关键字就可以用作有效标识符。

yield 关键字表示包含该关键字的方法或访问器是迭代器方法/访问器。迭代器方法/访问器是不返回单个值的方法/访问器。相反,它在迭代中被调用,并在每次迭代中返回不同的值。

语法

yield 关键字的语法非常简单。您只需在方法或访问器的 return 语句之前指定关键字即可。

yield return <expression>;

或者

yield break;

这是关键字的两种实现。当与 return 语句一起使用时,yield 关键字返回根据表达式计算的下一个值,直到满足表达式的退出条件。当与break关键字一起使用时,yield关键字会中断迭代,程序的执行将脱离方法/访问器。

Yield 关键字在 C# 中如何工作?

  1. 那么,C#中的关键字词是怎么表示的呢? C#编译器中关键字的内部实现是怎样的?让我们了解一下。包含yield 关键字的方法可以由迭代器循环(例如foreach 或LINQ 查询)使用。循环的每次迭代都会调用该方法。方法中的代码会一直执行,直到遇到yield return或yield break语句。
  2. 方法中执行的当前位置将被保留,下一次迭代将从上一次迭代中停止的位置继续。
  3. 这很简单,不是吗?让我们来看看它的技术实现。包含yield关键字的方法必须始终返回IEnumerable或IEnumerator。每当编译器遇到yield关键字时,它就知道该方法被迭代器使用。当方法被调用时,编译器不会像平常那样执行方法体。
  4. 相反,它执行方法主体并将一组已编译的 IEnumerable 返回给使用的迭代器变量。每次调用该方法时,编译器都会查找yield 语句并在该语句处暂停执行。循环的下一次迭代从上次暂停的位置继续执行。这一直持续到循环的退出条件或yieldbreak语句为止。为了在每次迭代后存储状态信息,编译器创建一个状态机。

C# 中的 Yield 关键字示例

让我们考虑一些例子:

示例 #1 – 方法

下面的示例使用yield 关键字生成斐波那契数列。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
foreach (int ele in GetFibonacciSeries(10))
{
Console.Write(ele + "\t");
}
}
public static IEnumerable<int> GetFibonacciSeries(int x)
{
for (int a = 0, b = 0, c = 1; a < x; a++)
{
yield return b;
int temp = b + c;
b = c;
c = temp;
}
}
}

C# 中的 Yield 关键字

示例 #2 – 访问器

下面的示例将yield关键字与get访问器结合使用。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
foreach (Day day in new Days().DaysOfWeek)
{
Console.WriteLine("Day {0} of the week is {1}", day.DayOfWeek, day.DayName);
}
}
public static IEnumerable<int> Show(int x)
{
for (int a = 0, b = 0, c = 1; a < x; a++)
{
yield return b;
int temp = b + c;
b = c;
c = temp;
}
}
public class Days
{
public IEnumerable<Day> DaysOfWeek
{
get
{
yield return new Day{DayName = "Sunday", DayOfWeek = 1};
yield return new Day{DayName = "Monday", DayOfWeek = 2};
yield return new Day{DayName = "Tuesday", DayOfWeek = 3};
yield return new Day{DayName = "Wednesday", DayOfWeek = 4};
yield return new Day{DayName = "Thursday", DayOfWeek = 5};
yield return new Day{DayName = "Friday", DayOfWeek = 6};
yield return new Day{DayName = "Saturday", DayOfWeek = 7};
}
}
}
public class Day
{
public string DayName
{ get; set; }
public int DayOfWeek
{ get; set; }
}
}

C# 中的 Yield 关键字

示例 #3 – 屈服点

以下示例演示了yield break语句的使用。一旦找到系列中的数字或达到最大搜索限制,迭代就会终止。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
int elementToFind = 21;
int maxElements = 100;
foreach (int ele in FindFibonacciNumber(elementToFind, maxElements))
{
Console.Write("Found the number " + elementToFind + " in Fibonacci series.");
}
}
public static IEnumerable<int> FindFibonacciNumber(int n, int max)
{
for (int a = 0, b = 0, c = 1; true; a++)
{
if (a > max)
{
Console.Write("Searched first " + max + " Fibonacci numbers. Element " + n + " not found");
yield break;
}
if (b == n)
{
yield return b;
yield break;
}
int temp = b + c;
b = c;
c = temp;
}
}
}

C# 中的 Yield 关键字

如果我们更改 elementToFind 1234,输出将是 –

C# 中的 Yield 关键字

规则

1) 每个元素必须使用yield return 语句一次返回一个。
2) 返回类型必须是 IEnumerable 或 IEnumerator。
3)不能将in、ref或out关键字与yield一起使用。
4) Yield 关键字不能与 Lambda 表达式或匿名方法一起使用。
5)yield return 语句不能位于 try-catch 块内。它可以位于 try-finally 块内。
6) Yield Break 语句不能位于 try-finally 块内。它可以位于 try-catch 块内。

优点

yield 关键字无需创建临时集合。在从方法返回数据之前,您无需创建临时集合来存储数据。此外,方法的执行状态被保留,因此不需要显式存储在代码中。

结论 – C# 中的 Yield 关键字

从这篇文章中我们了解到如何yield关键字是C#中一个非常有用的关键字。它有助于用尽可能少的行代码编写复杂的问题,并且使代码易于理解。这是一篇关于 C# 之旅的高级文章。建议尝试在代码中使用关键字,以便获得一些实践练习。

以上是C# 中的 Yield 关键字的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:C# Lambda Expression下一篇:C# Predicate