Je vais m'étendre un peu sur mon commentaire, qui se lit comme suit :
Je viens de commencer à utiliser Lazy, et je trouve que c'est souvent une indication d'une mauvaise conception ou de la paresse de la part du programmeur. De plus, une inconvénient, c'est qu'il faut être plus vigilant avec les scoped up. et créer des fermetures appropriées.
Par exemple, j'ai utilisé Lazy<T>
pour créer les pages que l'utilisateur peut voir dans mon ( sans session ) Application MVC. Il s'agit d'un assistant de guidage, de sorte que l'utilisateur peut vouloir aller à un endroit aléatoire de l'application. précédent étape. Lorsque la poignée de main est effectuée, un tableau de Lazy<Page>
est créé, et si l'utilisateur spécifie une étape, cette page exacte est évaluée. Je trouve qu'il offre de bonnes performances, mais il y a certains aspects que je n'aime pas, par exemple beaucoup de mes objets de type foreach
ressemble maintenant à ceci :
foreach(var something in somethings){
var somethingClosure = something;
list.Add(new Lazy<Page>(() => new Page(somethingClosure));
}
En d'autres termes, vous devez traiter le problème des fermetures de manière très proactive. Sinon, je ne pense pas que le fait de stocker une lambda et de l'évaluer en cas de besoin soit une si mauvaise performance.
D'un autre côté, cela peut indiquer que le programmeur est un Lazy<Programmer>
dans le sens où vous préférez ne pas penser à votre programme maintenant, et laisser la logique appropriée s'évaluer quand c'est nécessaire, comme par exemple dans mon cas - au lieu de construire ce tableau, je pourrais juste déterminer quelle serait la page spécifique demandée ; mais j'ai choisi d'être paresseux, et de faire une approche tout en un.
EDIT
Il me semble que Lazy<T>
a également quelques particularités lorsqu'il travaille avec la concurrence. Par exemple, il existe un ThreadLocal<T>
pour certains scénarios, et plusieurs configurations de drapeaux pour votre scénario multithread particulier. Vous pouvez en savoir plus sur msdn .
4 votes
Je viens de commencer à utiliser Lazy<T>, et je trouve que c'est souvent le signe d'une mauvaise conception, ou de la paresse du programmeur. De plus, l'un des inconvénients est qu'il faut être plus vigilant avec les variables de type "scoped up" et créer des fermetures appropriées.
4 votes
@Gleno En quoi consiste exactement la paresse du programmeur ?
4 votes
@Gleno, Anton : Et plus important encore, pourquoi est-ce mauvais ? J'enseigne toujours dans mes cours de programmation que la paresse est une vertu importante chez les programmeurs.
2 votes
Je suis sûrement pour la paresse aussi, mais parfois il peut être plus facile de faire une évaluation paresseuse que de réfléchir à la ressource exacte qui sera utilisée. Dans ce cas, on manque des occasions de comprendre, de simplifier et d'embellir son propre code.