Linq学习总结(3)——yield

yield向编译器指示它所在的方法是迭代器块。

yield并不是.NET中的关键字,所以我们可以将它用于变量名。不过yield return和yield break就是关键词组了。

yield return

yield return 是迭代器(Iterator Pattern)模式的一种实现,能够将本身不是可迭代集合的对象做成可迭代集合。

static void Main(string[] args)
{
foreach (var item in getNums())
{
Console.WriteLine(item);
}
}

static IEnumerable getNums()
{
yield return "start";

yield return 1;
yield return 2;
yield return 3;
yield return 4;

yield return "end";
}

注意事项:

  • yield return后面要跟一个表达式,该表达式必须能转换为迭代器所使用的类型;
  • yield return只能用于迭代器块中;这个迭代器块即可以放在方法体中,也可以放在运算函数中,还可以用在访问器中(即属性方法);
  • yield return 不能在不安全块中(unsafe);
  • 方法、运算符或访问器的参数不能是ref或out;
  • yield return不能出现在catch语句中,也不能出现在带有一个或多个catch子句的try块中;
  • yield 语句不能出现在匿名方法中。

yield break

由于某种原因,需要在最后的元素返回之前就结束掉可以用yield break关键词组。

static void Main(string[] args)
{
foreach (var item in getNums())
{
Console.WriteLine(item);
}
}

static IEnumerable getNums()
{
yield return "start";

yield return 1;
yield return 2;

yield break;

yield return 3;
yield return 4;

yield return "end";
}

这样就不会输出2之下的信息了。

总结

关键词组yield return和yield break是在.NET 2.0中引入的。Yield return用于创建一个自动生成的、类型化的枚举器,而yield break则用于达到最终元素之前终止迭代。它们在LINQ查询上也非常有用,LINQ的延迟机制的关键就是在yield上。

更多相关文章可以查看:(MARK)

http://kb.cnblogs.com/page/42581/

http://www.cnblogs.com/jeffreyzhao/archive/2010/01/26/decompile-methods-with-yield-manually.html

posted @ 2011-06-21 13:55  heqichang  阅读(811)  评论(0编辑  收藏  举报