Yield语法糖
Yield是一个C#的语法糖,简化了诸如下面的方法,在返回迭代器接口类型IEnumerable<T>的函数中可以简化迭代器接口对象的创建。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private static IEnumerable<string> GetCollByCommon() { List<string> list = new List<string>(); list.Add("4"); list.Add("5"); list.Add("6"); return list; }
private static IEnumerable<string> GetCollByYield() { yield return "1"; yield return "2"; yield return "3"; }
|
需要注意的是此函数的运行时机,采用以下代码测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| static void Main(string[] args) { Console.WriteLine("Test is beginning!"); IEnumerable<string> yield = GetCollByYield(); Console.WriteLine("Loop is beginning!"); foreach (var p in yield) Console.WriteLine(p); }
private static IEnumerable<string> GetCollByYield() { Console.WriteLine("GetCollByYield method is called!"); yield return "1"; yield return "2"; yield return "3"; }
|
运行结果如下,说明在使用yield关键字的方法中方法总是在使用方法的返回结果时才会被调用。
1 2 3 4 5 6
| Test is beginning! Loop is beginning GetCollByYield method is called! 1 2 3
|
另外使用yield还有一些注意事项:
你不能在具有以下特点的方法中包含 yield return 或 yield break 语句:
匿名方法。 有关详细信息,请参阅匿名方法(C# 编程指南)。
包含不安全的块的方法。 有关详细信息,请参阅unsafe(C# 参考)。
异常处理
不能将 yield return 语句置于 try-catch 块中。 可将 yield return 语句置于 try-finally 语句的 try 块中。
yield break 语句可以位于 try 块或 catch 块,但不能位于 finally 块。
如果 foreach 主体(在迭代器方法之外)引发异常,则将执行迭代器方法中的 finally 块。