一个例子说明yield的用处
class Program { public static IEnumerable SimpleList() { for (int i = 0; i < 100; i++) { yield return i; } } public static int[] SimpleArray() { int[] a; a = new int[100]; for (int i = 0; i < 100; i++) { a[i] = i; } return a; } static void Main(string[] args) { foreach (int item in SimpleList()) { if(item == 56) Console.WriteLine(item); } foreach (int intValue in SimpleArray()) { if (intValue == 56) Console.WriteLine(intValue); } Console.ReadKey(); } }
传统的执行方法
- 调用函数
- 函数执行并返回list
- 调用部分使用返回的list
Yield的执行方法
- 调用函数
- 调用者请求item
- 下一个item返回
- 回到步骤2
虽然yield执行的实现貌似有些复杂,但我们最终只需要一次“弹出”一个item,而不是创建整个list并返回.
对于句法说,我个人认为yield更加简洁,并且对于传递函数的用途表现的更好(译者按:也就是代码可读性),我使用IEnumerable作为返回类型来通知调用者它可以被foreach循环并且返回数据,而调用者现在可以自己决定它是否愿意将返回值存放到列表中,即使这会以性能作为代价。
在我提供的这个简单例子中,也许你并不能发现很多使用yield的好处,然而,你可以在调用者需要取消遍历所有的函数提供的内容时节省很多不必要的工作,当你在方法链接时使用yield,你可以省下的工作(时间)或许会成倍叠加。