Ok, comme je farfouillé avec la construction d'un recenseur personnalisé, j'avais remarqué ce comportement qui concerne le rendementLes merveilles du mot-clé yield
Supposons que vous avez quelque chose comme ceci:
public class EnumeratorExample
{
public static IEnumerable<int> GetSource(int startPoint)
{
int[] values = new int[]{1,2,3,4,5,6,7};
Contract.Invariant(startPoint < values.Length);
bool keepSearching = true;
int index = startPoint;
while(keepSearching)
{
yield return values[index];
//The mind reels here
index ++
keepSearching = index < values.Length;
}
}
}
Qu'est-ce qui rend possible sous le capot du compilateur d'exécuter l'index ++ et le reste du code dans la boucle while après avoir techniquement fait un retour de la fonction?
Oui, d'accord, machine d'état, c'est ce que j'ai lu. Mais quel genre de code génère-t-il et que fait cette machine d'état? Pseudo code serait grandement apprécié. – dexter
@Max Malygin: L'article que j'ai lié à http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx montre le code qui est généré. –
@Mark, cool, merci, je vais vérifier ceux-là! – dexter