Je regarde les vidéos de Jon Skeet Copenhagen C# talk et j'ai fini avec ce code.
QUESTION:
Que se passe-t-il après l'impression du code Fini. Je veux dire pourquoi iterator.MoveNext()
échoue?Comprendre les blocs d'itérateur et la méthode d'élimination
CODE:
class IteratorBlocks
{
public static IEnumerable<string> GetStringsForever()
{
string current = "";
char nextChar = 'a';
try
{
while (true)
{
current += nextChar;
nextChar++;
if (nextChar > 'z')
{
nextChar = 'a';
}
yield return current;
}
}
finally
{
Console.WriteLine("Finished");
}
}
}
class Program
{
static void Main(string[] args)
{
IEnumerable<string> strings = IteratorBlocks.GetStringsForever();
IEnumerator<string> iterator = strings.GetEnumerator();
for (int i = 0; i < 10; i++)
{
iterator.MoveNext();
Console.WriteLine(iterator.Current);
}
/*
I am not able to get what the code is doing beyond this line?
*/
iterator.Dispose();
for (int i = 0; i < 10; i++)
{
iterator.MoveNext();
Console.WriteLine(iterator.Current);
}
}
}
OUTPUT:
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefghi
abcdefghij
Finished
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
abcdefghij
@Jon Ne vous inquiétez pas Jon vous n'avez rien dit de mal dans la conversation :-). En fait, j'ai accidentellement copié-collé la seconde pour la boucle et ensuite couru dans le problème. Merci (+ 1A). –
@Jon 'Dispose ne "réinitialise" pas l'itérateur mais que fait-il alors dans ce cas? –
@david: Il le fait juste s'arrêter - il le met dans l'état "après", à quel point d'autres appels à MoveNext() retourneront juste faux sans rien faire d'autre. –