我想了解在C#中yield關鍵字的使用,因爲我正在使用的隊列建模包大量使用它。收益聲明對程序流的影響
爲了說明如何使用屈服的,我玩弄下面的代碼:
using System;
using System.Collections.Generic;
public class YieldTest
{
static void Main()
{
foreach (int value in ComputePower(2, 5))
{
Console.Write(value);
Console.Write(" ");
}
Console.WriteLine();
}
/**
* Returns an IEnumerable iterator of ints
* suitable for use in a foreach statement
*/
public static IEnumerable<int> ComputePower(int number, int exponent)
{
Console.Write ("Arguments to ComputePower are number: " + number + " exponent: " + exponent + "\n");
int exponentNum = 0;
int numberResult = 1;
while (exponentNum < exponent)
{
numberResult *= number;
exponentNum++;
// yield:
// a) returns back to the calling function (foreach),
// b) updates iterator value (2,4,8,16,32 etc.)
yield return numberResult;
}
}
}
這是非常明顯的代碼做什麼,它只是提高了2到使用ComputePower
它返回一個IEnumerable
動力。在調試代碼時,我看到yield
語句將控制返回到foreach
循環,並且value
變量用最新的功率結果更新。 2,4,8,16,32
不充分理解使用yield
,我期望ComputePower
通過ComputePower
和便見"Arguments to ComputePower are "
等控制檯寫發生5被調用的次數作爲值迭代倍。實際上發生的是似乎ComputePower
方法只被調用一次。每次運行我只看到一次"Arguments to ComputePower.."
字符串。
有人可以解釋爲什麼會出現這種情況嗎?它與yield
關鍵字有關嗎?
你讀過[yield](http://msdn.microsoft.com/library/9k7k7cf0.aspx)嗎? – Corak
是的,還是Jon Skeet的_C#深入解釋了這個非常好的 – djf
[yield statement implementation]的可能重複(http://stackoverflow.com/questions/742497/yield-statement-implementation) –