À quoi sert le mot-clé yield en C# ?

À quoi sert le mot-clé yield en C# ?

Le mot-clé contextuel yield fait en réalité beaucoup de choses ici.

La fonction retourne un objet qui implémente l’interface IEnumerable<object>. Si une fonction appelante commence à itérer (foreach) sur cet objet, la fonction est appelée à nouveau jusqu’à ce qu’elle « cède » (yield). C’est du sucre syntaxique introduit dans C# 2.0. Dans les versions antérieures, vous deviez créer vos propres objets IEnumerable et IEnumerator pour faire ce genre de choses.

La façon la plus simple de comprendre ce type de code est de saisir un exemple, de placer des points d’arrêt et de voir ce qui se passe. Essayez de parcourir pas à pas cet exemple :

public void Consumer()
{
    foreach(int i in Integers())
    {
        Console.WriteLine(i.ToString());
    }
}

public IEnumerable<int> Integers()
{
    yield return 1;
    yield return 2;
    yield return 4;
    yield return 8;
    yield return 16;
    yield return 16777216;
}

Lorsque vous parcourez l’exemple pas à pas, vous constaterez que le premier appel à Integers() retourne 1. Le deuxième appel retourne 2 et la ligne yield return 1 n’est plus exécutée.

Voici un exemple concret :

public IEnumerable<T> Read<T>(string sql, Func<IDataReader, T> make, params object[] parms)
{
    using (var connection = CreateConnection())
    {
        using (var command = CreateCommand(CommandType.Text, sql, connection, parms))
        {
            command.CommandTimeout = dataBaseSettings.ReadCommandTimeout;
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return make(reader);
                }
            }
        }
    }
}