J'ai la méthode d'extension suivante:
public static IEnumerable<T> Apply<T>(
[NotNull] this IEnumerable<T> source,
[NotNull] Action<T> action)
where T : class
{
source.CheckArgumentNull("source");
action.CheckArgumentNull("action");
return source.ApplyIterator(action);
}
private static IEnumerable<T> ApplyIterator<T>(this IEnumerable<T> source, Action<T> action)
where T : class
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
Il applique simplement une action à chaque élément de la séquence avant de la renvoyer.
Je me demandais si je devais appliquer l' Pure
attribut (des annotations Resharper) à cette méthode, et je peux voir des arguments pour et contre.
Avantages:
- à proprement parler, il est pur; simplement l'appeler sur une séquence ne modifie pas la séquence (elle renvoie une nouvelle séquence) ou ne fait aucun changement d'état observable
- l'appeler sans utiliser le résultat est clairement une erreur, car il n'a aucun effet à moins que la séquence ne soit énumérée, alors j'aimerais que Resharper m'avertisse si je fais cela.
Les inconvénients:
- même si la
Apply
méthode elle-même est pure, l'énumération de la séquence résultante fera des changements d'état observables (ce qui est le point de la méthode). Par exemple,items.Apply(i => i.Count++)
changera les valeurs des éléments à chaque fois qu'il est énuméré. Donc, appliquer l'attribut Pure est probablement trompeur ...
Qu'est-ce que tu penses? Dois-je appliquer l'attribut ou non?