C# yield
Mots clés : itérateurs et optimisation des performances
yield
joue un rôle essentiel en C#, qui simplifie l'implémentation des énumérateurs et la création d'itérateurs, améliorant considérablement la lisibilité et les performances du code. Examinons de plus près ses fonctionnalités.
Renvoyer les résultats étape par étape (Yielding Results
)
yield
permet à une méthode de suspendre son exécution et de renvoyer les résultats étape par étape. Lorsque la fonction appelante parcourt un objet qui implémente l'interface IEnumerable
, la méthode contenant le mot-clé yield
sera appelée à plusieurs reprises jusqu'à la fin de la séquence de retour. Ce mécanisme est appelé « céder ».
Par exemple, considérons l'extrait de code suivant :
<code class="language-csharp">IEnumerable<object> FilteredList() { foreach (object item in FullList) { if (IsItemInPartialList(item)) yield return item; } }</code>
FilteredList()
renvoie progressivement les objets de FullList
en fonction des conditions. Au fur et à mesure que l'appelant parcourt les résultats, la méthode renvoie chaque correspondance une par une.
Itérateur d'implémentation (Implementing Iterators
)
yield
simplifie la création d'itérateurs personnalisés. Dans les versions antérieures de C#, les énumérateurs devaient être implémentés manuellement à l'aide d'objets IEnumerator
. yield
propose une approche plus propre et plus déclarative :
<code class="language-csharp">public IEnumerable<int> Integers() { yield return 1; yield return 2; yield return 4; yield return 8; yield return 16; yield return 16777216; }</code>
Ce code renvoie une séquence d'entiers sans logique d'itération explicite.
Application pratique (Real-Life Usage
)
Dans les applications pratiques, yield
est souvent utilisé dans des scénarios d'évaluation paresseux, tels que la récupération de données à partir d'une base de données. Prenons l'exemple suivant :
<code class="language-csharp">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); } } } } }</code>
Cette méthode construit un énumérateur, récupère les enregistrements de la table de base de données et crée un objet de type T basé sur la fonction de mappage fournie make()
. En utilisant yield
, cette méthode évite de charger l'ensemble des résultats en mémoire, améliorant ainsi les performances lors du traitement de grands ensembles de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!