Yield 是 C# 中的上下文关键字。上下文关键字是 C# 中不为整个程序保留的关键字。相反,它们是程序某些部分的保留关键字,可以在其中相关地使用关键字。只要这些关键字的相关性不会向编译器传达任何特殊含义,这些关键字就可以用作有效标识符。
yield 关键字表示包含该关键字的方法或访问器是迭代器方法/访问器。迭代器方法/访问器是不返回单个值的方法/访问器。相反,它在迭代中被调用,并在每次迭代中返回不同的值。
语法
yield 关键字的语法非常简单。您只需在方法或访问器的 return 语句之前指定关键字即可。
yield return <expression>;
或者
yield break;
这是关键字的两种实现。当与 return 语句一起使用时,yield 关键字返回根据表达式计算的下一个值,直到满足表达式的退出条件。当与break关键字一起使用时,yield关键字会中断迭代,程序的执行将脱离方法/访问器。
让我们考虑一些例子:
下面的示例使用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; } } }
下面的示例将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; } } }
以下示例演示了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; } } }
如果我们更改 elementToFind 1234,输出将是 –
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 关键字无需创建临时集合。在从方法返回数据之前,您无需创建临时集合来存储数据。此外,方法的执行状态被保留,因此不需要显式存储在代码中。
从这篇文章中我们了解到如何yield关键字是C#中一个非常有用的关键字。它有助于用尽可能少的行代码编写复杂的问题,并且使代码易于理解。这是一篇关于 C# 之旅的高级文章。建议尝试在代码中使用关键字,以便获得一些实践练习。
以上是C# 中的 Yield 关键字的详细内容。更多信息请关注PHP中文网其他相关文章!