CSharp之Yield语法糖的使用

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 块。