Je sais que c'est une vieille question, mais j'aimerais donner un exemple de la façon dont le mot clé yield peut être utilisé de manière créative. J'ai vraiment profité de cette technique. J'espère que cela sera utile à quiconque trébuchera sur cette question.
Remarque: Ne pensez pas que le mot clé yield est simplement une autre façon de créer une collection. Une grande partie de la puissance du rendement vient du fait que l'exécution est suspendue dans votre méthode ou votre propriété jusqu'à ce que le code appelant répète la valeur suivante. Voici mon exemple:
L'utilisation du mot clé yield (à côté de l'implémentation Caliburn.Micro coroutines de Rob Eisenburg ) me permet d'exprimer un appel asynchrone à un service Web comme celui-ci:
public IEnumerable<IResult> HandleButtonClick() {
yield return Show.Busy();
var loginCall = new LoginResult(wsClient, Username, Password);
yield return loginCall;
this.IsLoggedIn = loginCall.Success;
yield return Show.NotBusy();
}
Ce que cela va faire est d'allumer mon BusyIndicator, d'appeler la méthode Login sur mon service Web, de définir mon indicateur IsLoggedIn sur la valeur de retour, puis de désactiver le BusyIndicator.
Voici comment cela fonctionne: IResult a une méthode Execute et un événement Completed. Caliburn.Micro récupère l'IEnumerator de l'appel à HandleButtonClick () et le transmet à une méthode Coroutine.BeginExecute. La méthode BeginExecute commence l'itération à travers les IResults. Lorsque le premier IResult est renvoyé, l'exécution est suspendue dans HandleButtonClick () et BeginExecute () attache un gestionnaire d'événements à l'événement Completed et appelle Execute (). IResult.Execute () peut effectuer une tâche synchrone ou asynchrone et déclenche l'événement Completed lorsqu'il est terminé.
LoginResult ressemble à ceci:
public LoginResult : IResult {
// Constructor to set private members...
public void Execute(ActionExecutionContext context) {
wsClient.LoginCompleted += (sender, e) => {
this.Success = e.Result;
Completed(this, new ResultCompletionEventArgs());
};
wsClient.Login(username, password);
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
public bool Success { get; private set; }
}
Il peut être utile de configurer quelque chose comme ça et de parcourir l'exécution pour voir ce qui se passe.
J'espère que cela aide quelqu'un! J'ai vraiment aimé explorer les différentes façons dont le rendement peut être utilisé.
yield
est lié àIEnumerable<T>
et son genre. C'est en quelque sorte une évaluation paresseuse